多个 Kafka 消费者可以从分区中读取相同的消息吗
Posted
技术标签:
【中文标题】多个 Kafka 消费者可以从分区中读取相同的消息吗【英文标题】:Can multiple Kafka consumers read same message from the partition 【发布时间】:2016-06-04 07:41:09 【问题描述】:我们计划编写一个 Kafka 消费者(java),它读取 Kafka 队列以执行消息中的操作。
由于消费者独立运行,消息是否一次只由一个消费者处理?否则所有消费者处理相同的消息,因为他们在分区中有自己的偏移量。
请帮助我理解。
【问题讨论】:
看起来 kafka 没有队列。它只有主题 所有 kafka 主题都是有序集——换句话说,它们是队列。 Kafkatopics
不是队列,因为一旦从 topic
消费了一条消息,它就会停留在那里(除非它的生命周期已过期)并且 offset
移动到下一个,而对于一个队列,一旦消息被消费,该消息就会从该队列中删除。订购的套装也仅限partitions
。
【参考方案1】:
这取决于Group ID。假设您有一个包含 12 个分区的主题。如果您有 2 个具有相同组 ID 的 Kafka 消费者,他们将读取 6 个分区,这意味着他们将读取不同的分区集 = 不同的消息集。如果您有 4 个具有相同 Group Id 的 Kafka cosnumer,则每个人都将读取三个不同的分区等。
但是当你设置不同的 Group Id 时,情况就发生了变化。如果您有两个具有不同组 ID 的 Kafka 消费者,他们将读取所有 12 个分区,而彼此之间没有任何干扰。这意味着两个消费者将独立阅读完全相同的一组消息。如果您有四个具有不同组 ID 的 Kafka 消费者,他们都会读取所有分区等。
【讨论】:
您不能通知其他消费者一条消息没有被正确处理。但是,如果一个消费者失败了,另一个消费者将接替他的工作。含义:如果你有 12 个分区和 3 个具有相同 Group Id 的消费者,则每个消费者读取 4 个分区。如果一个消费者失败,rebalancing 发生,现在两个活着的消费者将读取 6 个分区。请注意,如果您不在每条消息后更新偏移量,您可能会多次阅读某些消息。 2) 偏移量由主题、分区和组 id 定义。具有相同组 id 的活着的消费者可以检索偏移量,因为他们阅读相同的主题并且具有相同的组 id。 @FaizHalde:在我们的例子中:首先,我们使用每条消息进行实时处理,然后当我们将消息从 Kafka 传输到 HDFS 以进行进一步分析时,我们第二次使用同一组消息。一般来说,如果你有多个微服务,每个微服务都可以读取相同的消息并用它们做不同的事情。 当同一个组中有更多的消费者,比如说14个,而只有12个分区会发生什么?多余的消费者还能连接到 Kafka 吗? @BiancaTesila 剩下的两个消费者将被连接,但他们什么也不读。基本上他们是不活跃的。【参考方案2】:我发现这张来自 OReilly 的图片很有帮助:
在同一组内:否
同一组 (Group 1) 中的两个消费者 (Consumer 1, 2) 不能 从分区 (分区 0)。跨不同组:是
两组中的两个消费者(Group 1 中的Consumer 1,Group 2 中的Consumer 1)CAN 从分区(Partition 0)消费相同的消息。【讨论】:
【参考方案3】:Kafka 会将订阅主题中的每条消息传递给每个消费者组中的一个进程。这是通过平衡消费者组中所有成员之间的分区来实现的,以便每个分区都分配给组中的一个消费者。从概念上讲,您可以将消费者组视为恰好由多个进程组成的单个逻辑订阅者。
简而言之,每个消费者组仅由一个消费者进程处理 Kafka 消息/记录。因此,如果您希望多个消费者处理消息/记录,您可以为消费者使用不同的组。
【讨论】:
非常感谢。这有助于我了解消费者群体背后的真正目的。以上是关于多个 Kafka 消费者可以从分区中读取相同的消息吗的主要内容,如果未能解决你的问题,请参考以下文章