Apache kafka 多个Kafka使用者能否从分区读取相同的消息

Apache kafka 多个Kafka使用者能否从分区读取相同的消息,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,我们计划编写一个Kafka使用者(java),它读取Kafka队列以执行消息中的操作 由于消费者独立运行,消息一次是否只由一个消费者处理?否则,所有使用者处理相同的消息,因为他们在分区中有自己的偏移量 请帮我理解。这要看情况而定。假设您有一个包含12个分区的主题。如果有两个Kafka使用者具有相同的组Id,则它们都将读取6个分区,这意味着它们将读取不同的分区集=不同的消息集。如果您有4个具有相同组Id的Kafka余数,则每个余数都将读取三个不同的分区等 但当您设置不同的组Id时,情况会发生变化。

我们计划编写一个Kafka使用者(java),它读取Kafka队列以执行消息中的操作

由于消费者独立运行,消息一次是否只由一个消费者处理?否则,所有使用者处理相同的消息,因为他们在分区中有自己的偏移量

请帮我理解。

这要看情况而定。假设您有一个包含12个分区的主题。如果有两个Kafka使用者具有相同的组Id,则它们都将读取6个分区,这意味着它们将读取不同的分区集=不同的消息集。如果您有4个具有相同组Id的Kafka余数,则每个余数都将读取三个不同的分区等


但当您设置不同的组Id时,情况会发生变化。如果您有两个具有不同组Id的Kafka使用者,则他们将读取所有12个分区,彼此之间不会产生任何干扰。这意味着两个消费者将独立阅读完全相同的消息集。如果您有四个具有不同组Id的Kafka使用者,他们都将读取所有分区等。

Kafka将把订阅主题中的每条消息传递给每个使用者组中的一个进程。这是通过平衡使用者组中所有成员之间的分区来实现的,这样每个分区就被分配给组中的一个使用者。从概念上讲,您可以将使用者组视为碰巧由多个进程组成的单个逻辑订阅者


简而言之,卡夫卡消息/记录只由每个消费群体的一个消费进程处理。因此,如果您希望多个消费者处理消息/记录,您可以为消费者使用不同的组。

我发现来自OReilly的此图像非常有用:

同一组内:

  • 同一组(组1)中的两个使用者(使用者1,2)不能使用来自分区(分区0)的相同消息
跨不同组:

  • 两个组中的两个使用者(来自组1的使用者1,来自组2的使用者1)可以使用来自分区(分区0)的相同消息

您不能通知其他消费者一条消息未正确处理。但如果一个消费者失败,另一个消费者将接受他的工作。意思是:如果您有12个分区和3个具有相同组Id的使用者,则每个使用者读取4个分区。如果一个使用者失败,则发生,现在两个活着的使用者将读取6个分区。请注意,如果不在每条消息之后更新偏移量,则可以多次读取某些消息。2)偏移量是由主题、分区和组id定义的。具有相同组id的活着的消费者可以检索偏移量,因为他们读取相同的主题,并且拥有相同的组id。@FaizHalde:在我们的示例中:首先,我们使用每一条消息进行实时处理,之后当我们将消息从Kafka传输到HDFS进行进一步分析时,我们第二次使用同一组消息。一般来说,如果您有多个微服务,每个微服务都可以读取相同的消息并使用它们执行不同的操作。如果同一组中有更多消费者,比如说14个,而只有12个分区,会发生什么情况?多余的消费者还可以连接到卡夫卡吗?@BiancaTesila剩余的两个消费者可以连接,但他们什么也看不到。基本上它们是不活动的。看起来卡夫卡没有队列。它只有主题所有卡夫卡主题都是有序集-换句话说,它们是队列。卡夫卡
主题
不是队列,因为一旦从
主题
中消费了消息,它就会停留在那里(除非其生存期已过),并且
偏移量会移动到下一个,而对于队列,一旦消费了消息,消息将从该队列中删除。有序集也只能通过
分区进行排序。非常感谢。这有助于我理解消费者群体背后的真正目的。