我们计划编写一个 Kafka 消费者(java),它读取 Kafka 队列以执行消息中的操作。
由于消费者独立运行,消息是否一次只由一个消费者处理?否则所有消费者处理相同的消息,因为他们在分区中有自己的偏移量。
请帮我理解。
topics
不是队列,因为一旦从 topic
消费了一条消息,它就会停留在那里(除非它的生命周期已过期)并且 offset
移动到下一个,而对于队列来说,一旦消费了一条消息,该消息将从该队列中删除。订购集也仅限于 partitions
。
这取决于 Group ID。假设您有一个包含 12 个分区的主题。如果您有 2 个具有相同组 ID 的 Kafka 消费者,他们将读取 6 个分区,这意味着他们将读取不同的分区集 = 不同的消息集。如果您有 4 个具有相同组 ID 的 Kafka cosnumer,则每个人都将读取三个不同的分区等。
但是当你设置不同的 Group Id 时,情况就会发生变化。如果您有两个具有不同组 ID 的 Kafka 消费者,他们将读取所有 12 个分区,而彼此之间没有任何干扰。这意味着两个消费者将独立阅读完全相同的一组消息。如果您有四个具有不同组 ID 的 Kafka 消费者,他们都会读取所有分区等。
我发现这张来自 OReilly 的图片很有帮助:
https://www.oreilly.com/library/view/kafka-the-definitive/9781491936153/assets/ktdg_04in05.png
在同一组内:否
同一组(Group 1)中的两个消费者(Consumer 1、2)不能使用来自分区(Partition 0)的相同消息。
跨不同组:是
两个组中的两个消费者(组 1 中的消费者 1,组 2 中的消费者 1)可以从分区(分区 0)消费相同的消息。
Kafka 会将订阅主题中的每条消息传递给每个消费者组中的一个进程。这是通过平衡消费者组中所有成员之间的分区来实现的,以便将每个分区分配给组中的一个消费者。从概念上讲,您可以将消费者组视为恰好由多个进程组成的单个逻辑订阅者。
简而言之,每个消费者组仅由一个消费者进程处理 Kafka 消息/记录。因此,如果您希望多个消费者处理消息/记录,您可以为消费者使用不同的组。