多个Kafka消费者可以从分区读取相同的消息

时间:2016-02-22 18:28:29

标签: apache-kafka kafka-consumer-api

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

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

请帮助我理解。

3 个答案:

答案 0 :(得分:62)

这取决于Group ID。假设您有一个包含12个分区的主题。如果您有2个具有相同组ID的Kafka消费者,他们将读取6个分区,这意味着他们将读取不同的分区集=不同的消息集。如果您有4个具有相同组ID的Kafka cosnumers,则每个都将读取三个不同的分区等。

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

答案 1 :(得分:5)

我发现OReilly的这张图片很有帮助:

kafka

在同一组中:

  • 同一组(组1 )中的两个使用者(消费者1、2 不能使用来自分区(<< em>分区0 )。

在不同的组中:

  • 两组中的两个消费者(来自 Group 1 Consumer 1 ,来自 Group 2 Consumer 1 )< strong> CAN 使用来自分区(分区0 )的相同消息。

答案 2 :(得分:1)

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

用简单的话来说,每个消费者组仅由一个消费者进程处理Kafka消息/记录。因此,如果您希望多个使用者处理消息/记录,则可以为使用者使用不同的组。