我们计划编写一个Kafka使用者(java),它读取Kafka队列以执行消息中的操作。
由于消费者独立运营,消息一次只能由一个消费者处理吗?否则所有消费者处理相同的消息,因为他们在分区中有自己的偏移量。
请帮助我理解。
答案 0 :(得分:62)
这取决于Group ID。假设您有一个包含12个分区的主题。如果您有2个具有相同组ID的Kafka消费者,他们将读取6个分区,这意味着他们将读取不同的分区集=不同的消息集。如果您有4个具有相同组ID的Kafka cosnumers,则每个都将读取三个不同的分区等。
但是当您设置不同的组ID时,情况会发生变化。如果您有两个具有不同组ID的Kafka消费者,他们将读取所有12个分区,彼此之间没有任何干扰。这意味着两个消费者将独立地阅读完全相同的消息集。如果您有四个具有不同组ID的Kafka消费者,他们将全部读取所有分区等。
答案 1 :(得分:5)
我发现OReilly的这张图片很有帮助:
在同一组中:否
在不同的组中:是
答案 2 :(得分:1)
Kafka将订阅主题中的每条消息传递给每个消费者组中的一个流程。这是通过平衡使用者组中所有成员之间的分区来实现的,以便将每个分区分配给组中的一个使用者。从概念上讲,您可以将消费者组视为是一个由多个进程组成的单个逻辑订户。
用简单的话来说,每个消费者组仅由一个消费者进程处理Kafka消息/记录。因此,如果您希望多个使用者处理消息/记录,则可以为使用者使用不同的组。