在Kubernetes部署中的任何一个Pod上运行进程
我有一个应用程序,可以在多个吊舱上运行,并在流量增加时扩展。该应用程序的一个特点是“它从卡夫卡那里拾取消息并触发电子邮件” 当多个豆荚运行时,所有豆荚都会触发电子邮件,因为所有豆荚都应该按照设计接收消息 如何限制电子邮件功能一次只能在任何一个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
集群-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会做什么?使用消费群体可以确保某些电子邮件是安全的