来自不同消费者组的多个消费者如何从同一个分区中读取?

Posted

技术标签:

【中文标题】来自不同消费者组的多个消费者如何从同一个分区中读取?【英文标题】:How multiple consumers from different consumer groups read from same partition? 【发布时间】:2020-03-06 07:06:11 【问题描述】:

我有一个用例,我在不同的消费者组(cg1 和 cg2)中有 2 个消费者订阅具有 4 个分区的同一主题(主题 A)。 如果两个消费者都从同一个分区读取,其中一个失败而另一个提交了偏移量,会发生什么?

【问题讨论】:

【参考方案1】:

在 Kafka 中,偏移量管理由 每个分区的消费者组完成。

如果您有两个消费者组读取同一个主题,甚至对一个消费者组的提交进行分区,则不会对另一个消费者组产生任何影响。消费群体完全解耦。

【讨论】:

我如何确保这些消费者读取相同的数据?如果假设一个消费者已将偏移量重置为从以前的某个位置读取,那么两个消费者将一次读取不同的数据。 如前所述,如果您有两个消费者组,则它们彼此完全封装在一起,彼此独立地读取数据。我想知道为什么你需要两个不同的消费者同时做同样的事情。 假设我想实现这个场景。为此我需要遵循什么设计? 你能解释一下背景吗?这两个消费者的目的是什么?如果我理解正确,您只需要一个消费者做两件不同的事情,并且只有在这两件事完成后才提交偏移量。 这个没有背景,我只是想了解是否可以创建这个用例【参考方案2】:

消费者组的一个消费者可以从单个主题分区中读取数据。单个消费者无法从主题的多个分区中读取数据。

示例 Consumer Group 1 的Consumer 1 只能读取单个主题分区的数据。

偏移量管理由动物园管理员完成。

__consumer_offsets: 每个消费者组都维护其每个主题分区的偏移量。从 v0.9 开始,每个消费者组的已提交偏移信息都存储在这个内部主题中(在 v0.9 之前,此信息存储在 Zookeeper 上)。

当偏移管理器收到 OffsetCommitRequest 时,它会将请求附加到名为 __consumer_offsets 的特殊压缩 Kafka 主题中。最后,偏移量管理器将向消费者发送一个成功的偏移量提交响应,只有当偏移量主题的所有副本都收到偏移量时。

【讨论】:

【参考方案3】:

同时来自两个不同消费者组(cg1和cg2)的两个消费者可以读取同一主题的数据。

在 kafka 1 中:偏移管理由 zookeeper 负责。

在 kafka 2 中:每个消费者的偏移量存储在 __Consumer_offsets 主题中

用于跟踪消费者的偏移量(消费者消费了多少记录),假设消费者 1 消费了 10 条记录,消费者 2 消费了 20 条记录,而消费者 1 现在突然死亡,只要消费者 1 会然后它将从 第 11 条记录开始开始读取。

【讨论】:

因此,在 kafka 中,偏移量维持在消费者级别。对吗? 消费群体层面

以上是关于来自不同消费者组的多个消费者如何从同一个分区中读取?的主要内容,如果未能解决你的问题,请参考以下文章

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

kafka消费者java版本读取不到消息怎么办

Kafka分区与消费者的关系

如何消费来自多个主题的消息?

同一个分区真的永远不会被一个组上的多个消费者同时消费吗

Kafka快速入门(Kafka消费者)