集群应用-一次只能从kafka读取一台服务器,我缺少什么?

时间:2019-05-16 17:40:16

标签: spring-integration spring-kafka

我有一个围绕Spring工具构建的集群应用程序,使用kafka作为结构的消息层。从较高的层次上讲,它的体系结构是一个主进程,它将工作分解为在单独的硬件/ vm上运行的从属进程。

Master
   |_______________
   |       |      |
slave1  slave2 slave3

我希望发生的是,如果我在Kafka上抛出100条消息,则每个奴隶(在此示例中为3个)将拾取一定数量的消息并执行一定数量的工作(大约1/3)。这个例子)。

真正发生的是一个从站拾取所有消息并执行所有工作。不确定哪个从站将拾取消息,但是可以保证一个从站开始拾取消息,而其他的直到该从站完成其工作。

在我看来,从Kafka读取的内容似乎正在从队列中提取所有消息,而不是一次提取一个。这使我相信我错过了Kafka或Spring kafka上的配置。

1 个答案:

答案 0 :(得分:2)

我认为您没有概念性的了解什么是Apache Kafka及其工作原理。

首先,没有队列。消息在主题中解决。订阅的每个人都可以收到相同的消息。但是,有一个消费群体的概念。因此,如果使用者组相同,则与子服务器的数量无关,只有其中一个可以读取一条消息。

Kafka中还有另一个功能,称为“ 分区”。这样,您可以将邮件分发到不同的分区中,或者它们将自动分配:默认情况下是均匀分配的。此分区功能还有另一个角度可以使用。当我们在同一使用者组中有多个针对同一主题的订户时,分区将在它们之间分配。因此,您可以重新考虑逻辑以支持Apache Kafka中的内置功能。

但是,从Spring Kafka的角度来看,没有任何事情可做。您只需要为合理数量的分区正确配置主题,并为所有“从属”提供相同的使用者组即可。