我有一个围绕Spring工具构建的集群应用程序,使用kafka作为结构的消息层。从较高的层次上讲,它的体系结构是一个主进程,它将工作分解为在单独的硬件/ vm上运行的从属进程。
Master
|_______________
| | |
slave1 slave2 slave3
我希望发生的是,如果我在Kafka上抛出100条消息,则每个奴隶(在此示例中为3个)将拾取一定数量的消息并执行一定数量的工作(大约1/3)。这个例子)。
真正发生的是一个从站拾取所有消息并执行所有工作。不确定哪个从站将拾取消息,但是可以保证一个从站开始拾取消息,而其他的直到该从站完成其工作。
在我看来,从Kafka读取的内容似乎正在从队列中提取所有消息,而不是一次提取一个。这使我相信我错过了Kafka或Spring kafka上的配置。
答案 0 :(得分:2)
我认为您没有概念性的了解什么是Apache Kafka及其工作原理。
首先,没有队列。消息在主题中解决。订阅的每个人都可以收到相同的消息。但是,有一个消费群体的概念。因此,如果使用者组相同,则与子服务器的数量无关,只有其中一个可以读取一条消息。
Kafka中还有另一个功能,称为“ 分区”。这样,您可以将邮件分发到不同的分区中,或者它们将自动分配:默认情况下是均匀分配的。此分区功能还有另一个角度可以使用。当我们在同一使用者组中有多个针对同一主题的订户时,分区将在它们之间分配。因此,您可以重新考虑逻辑以支持Apache Kafka中的内置功能。
但是,从Spring Kafka的角度来看,没有任何事情可做。您只需要为合理数量的分区正确配置主题,并为所有“从属”提供相同的使用者组即可。