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

shi*_*455 28 apache-kafka kafka-consumer-api

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

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

请帮我理解.

Luk*_*ant 86

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

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

  • @BiancaTesila 剩下的两个消费者将被连接,但他们什么也读不到。基本上他们将处于非活动状态。 (4认同)
  • 当同一组中有更多消费者时会发生什么,假设有 14 个,并且只有 12 个分区?冗余消费者还能连接到Kafka吗? (3认同)
  • 您无法告知其他使用者一条消息未得到正确处理。但是,如果一个消费者失败,另一消费者将接任他的工作。含义:如果您有12个分区,并且3个使用者具有相同的组ID,则每个使用者读取4个分区。如果一个使用者失败,则会发生[重新平衡](http://stackoverflow.com/questions/27181693/how-does-consumer-rebalancing-work-in-kafka),现在两个在用的使用者将读取6个分区。请注意,如果在每条消息之后都没有更新偏移量,则可以多次读取某些消息。 (2认同)
  • 2) 偏移量由主题、分区和组 id 定义。具有相同组 ID 的活着的消费者可以检索偏移量,因为它们读取相同的主题并且具有相同的组 ID。 (2认同)
  • @FaizHalde:在我们的例子中:首先,我们消耗每条消息以进行实时处理,然后当我们将消息从Kafka传输到HDFS进行进一步分析时,我们第二次使用同一组消息。通常,如果您有多个微服务,则每个微服务都可以读取相同的消息并对它们执行不同的操作。 (2认同)

Syn*_*hen 27

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

卡夫卡

同组内:

  • 同一组(组 1)中的两个消费者(消费者 1、2不能消费来自分区(分区 0)的相同消息。

跨不同组:

  • 两个消费者在两个组(消费者1第1组消费者1第2组CAN消耗从分区(相同的消息分区0)。

  • 感谢您分享这一点——它确实帮助我更好地想象您提到的这两个场景。 (2认同)
  • @giacom0c 重新上传了图像 (2认同)

Kar*_*nna 17

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

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

  • 非常感谢。这帮助我了解了消费者群体背后的真正目的。 (2认同)