在Kubernetes部署中的任何一个Pod上运行进程

在Kubernetes部署中的任何一个Pod上运行进程,kubernetes,apache-kafka,akka,Kubernetes,Apache Kafka,Akka,我有一个应用程序,可以在多个吊舱上运行,并在流量增加时扩展。该应用程序的一个特点是“它从卡夫卡那里拾取消息并触发电子邮件” 当多个豆荚运行时,所有豆荚都会触发电子邮件,因为所有豆荚都应该按照设计接收消息 如何限制电子邮件功能一次只能在任何一个POD上工作 集群-EKS,编程语言-Scala-AKKA如果使用Kafka,则可以使用分区 对于每个主题,可以有多个分区。这些分区在使用者之间共享 例如: Email Topic: Partitions[0,1,2,3,4,5] Email Consum

我有一个应用程序,可以在多个吊舱上运行,并在流量增加时扩展。该应用程序的一个特点是“它从卡夫卡那里拾取消息并触发电子邮件”

当多个豆荚运行时,所有豆荚都会触发电子邮件,因为所有豆荚都应该按照设计接收消息

如何限制电子邮件功能一次只能在任何一个POD上工作


集群-EKS,编程语言-Scala-AKKA

如果使用Kafka,则可以使用分区

对于每个主题,可以有多个分区。这些分区在使用者之间共享

例如:

Email Topic: Partitions[0,1,2,3,4,5]

Email Consumer Group:
   Consumer 1: Partitions[0,3]
   Consumer 2: Partitions[1,4]
   Consumer 3: Partitions[2,5]

On Scale Up Event:
   Consumer 1: Partitions[0]
   Consumer 2: Partitions[1]
   Consumer 3: Partitions[2,5]
   Consumer 4: Partitions[3]
   Consumer 5: Partitions[4]

On Scale Down Event:
   Consumer 1: Partitions[0,2,4]
   Consumer 2: Partitions[1,3,5]

这样,特定组中只有一个使用者将使用该消息。

如果您使用Kafka,则可以使用分区

对于每个主题,可以有多个分区。这些分区在使用者之间共享

例如:

Email Topic: Partitions[0,1,2,3,4,5]

Email Consumer Group:
   Consumer 1: Partitions[0,3]
   Consumer 2: Partitions[1,4]
   Consumer 3: Partitions[2,5]

On Scale Up Event:
   Consumer 1: Partitions[0]
   Consumer 2: Partitions[1]
   Consumer 3: Partitions[2,5]
   Consumer 4: Partitions[3]
   Consumer 5: Partitions[4]

On Scale Down Event:
   Consumer 1: Partitions[0,2,4]
   Consumer 2: Partitions[1,3,5]
这样,特定组中只有一个使用者将使用该消息

如何将电子邮件功能限制为在任何一个 一次吃豆荚

简而言之:对触发电子邮件的所有POD使用相同的消费者群体。 通常,工作负载根据其所做的工作分为多个组。同一组的成员彼此分担工作量

您当然可以为您的POD提供Kafka消费者配置,如
bootstrap.servers
等。在该配置中,将一个名为
group.id
的属性指定给某个值,例如
email trigger group
,然后工作负载将按预期共享

你可以在你的豆荚上使用标签来触发电子邮件。您可以为您的消费者
group.id
为您的所有POD使用相同的标签值


我们可以将问题分为两个子问题:

1。触发电子邮件

此工作负载可由组中的多个使用者共享

2。回答前端的请求

对整个主题(所有分区)使用手动
consumer.assign()

前端将指定其希望从中获取新消息的时间戳,即带有时间戳的消息
>
此时间戳将从主题的所有分区中检索。为此,请使用
consumer.offsetsForTimes()
获取时间戳,轮询并将消息作为响应发送

List topicPartitions=consumer.partitions for(“您的主题”).stream().map(partitionInfo->new TopicPartition(partitionInfo.topic(),partitionInfo.partition()).toList();
consumer.assign(主题分区);
//填充地图
Map partitionTimestamp=新建LinkedHashMap();
//为所有分区添加从前端接收到的相同时间戳
topicPartitions.forEach(topicPartition->partitionTimestamp.put(topicPartition,timestampFromFrontend));
//获取偏移量并搜索
Map offsetsForTimes=consumer.offsetsForTimes(offsetsForTimestamp);
//寻求补偿
offsetsForTimes.forEach((tp,oft)->consumer.seek(tp,oft.offset());
//投票和返回
consumer.poll();
如何将电子邮件功能限制为在任何一个 一次吃豆荚

简而言之:对触发电子邮件的所有POD使用相同的消费者群体。 通常,工作负载根据其所做的工作分为多个组。同一组的成员之间共享工作负载

您当然可以为您的POD提供Kafka consumer配置,例如
bootstrap.servers
等。在该配置中,将名为
group.id
的属性指定给某个值,例如
email trigger group
,然后工作负载将按照您的预期进行共享

您可以为触发电子邮件的POD使用标签。您可以为所有POD的消费者
组.id
使用相同的标签值


我们可以将问题分为两个子问题:

1.触发电子邮件

此工作负载可由组中的多个使用者共享

2.回答前端的请求

对整个主题(所有分区)使用手动
consumer.assign()

前端将指定它希望新消息来自的时间戳,即带有时间戳的消息
此时间戳将从主题的所有分区中检索。为此,请使用
consumer.offsetsForTimes()
获取时间戳,轮询并将消息作为响应发送

List topicPartitions=consumer.partitions for(“您的主题”).stream().map(partitionInfo->new TopicPartition(partitionInfo.topic(),partitionInfo.partition()).toList();
consumer.assign(主题分区);
//填充地图
Map partitionTimestamp=新建LinkedHashMap();
//为所有分区添加从前端接收到的相同时间戳
topicPartitions.forEach(topicPartition->partitionTimestamp.put(topicPartition,timestampFromFrontend));
//获取偏移量并搜索
Map offsetsForTimes=consumer.offsetsForTimes(offsetsForTimestamp);
//寻求补偿
offsetsForTimes.forEach((tp,oft)->consumer.seek(tp,oft.offset());
//投票和返回
consumer.poll();

当消费者处理消息时,消息不会从其主题中删除。相反,消费者可以从多种方式中选择让卡夫卡知道哪些消息已被处理。此过程称为提交偏移量。因此,一旦您从列表中获得消息,您就需要立即提交偏移量,以便otehr消费者将其删除t以下消息“限制电子邮件功能一次在任何一个播客上工作”的确切含义是什么?@LeviRamsey,这意味着所有pod上都有电子邮件触发功能,但只有一个pod可以执行该功能。@Pranav如果只有一个pod触发电子邮件,其他pod会做什么?使用消费群体可以确保某些电子邮件是安全的