ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

请帮我理解。

看起来kafka没有队列。它只有主题
所有 kafka 主题都是有序集——换句话说,它们是队列。
Kafka topics 不是队列,因为一旦从 topic 消费了一条消息,它就会停留在那里(除非它的生命周期已过期)并且 offset 移动到下一个,而对于队列来说,一旦消费了一条消息,该消息将从该队列中删除。订购集也仅限于 partitions

L
Lukáš Havrlant

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

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


您不能通知其他消费者一条消息没有被正确处理。但是,如果一个消费者失败了,另一个消费者将接手他的工作。含义:如果你有 12 个分区和 3 个具有相同 Group Id 的消费者,则每个消费者读取 4 个分区。如果一个消费者失败,则发生 rebalancing,现在两个活着的消费者将读取 6 个分区。请注意,如果您在每条消息后不更新偏移量,您可能会多次阅读某些消息。
2)偏移量由topic、partition和group id定义。具有相同组 id 的活着的消费者可以检索偏移量,因为他们阅读相同的主题并且具有相同的组 id。
@FaizHalde:在我们的例子中:首先,我们使用每条消息进行实时处理,然后当我们将消息从 Kafka 传输到 HDFS 以进行进一步分析时,我们第二次使用同一组消息。一般来说,如果你有多个微服务,每个微服务都可以读取相同的消息并用它们做不同的事情。
当同一个组中有更多消费者(比如 14 个)并且只有 12 个分区时会发生什么?多余的消费者还能连接到 Kafka 吗?
@BiancaTesila 剩下的两个消费者将被连接,但他们什么也不读。基本上他们会不活跃。
S
SynergyChen

我发现这张来自 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)消费相同的消息。


K
Karan Khanna

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

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


非常感谢。这有助于我理解消费者群体背后的真正目的。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅