Kafka:使用普通消费者组访问多个主题
Posted
技术标签:
【中文标题】Kafka:使用普通消费者组访问多个主题【英文标题】:Kafka : Use common consumer group to access multiple topics 【发布时间】:2020-01-05 06:29:44 【问题描述】:我们的集群运行 Kafka 0.11,对使用消费者组有严格的限制。我们不能使用任意消费者组,因此管理员必须创建所需的消费者组。
我们运行 Kafka Connect HDFS Sinks 从主题读取数据并写入 HDFS。所有主题只有一个分区。
在 Kafka HDFS Sink 中使用 Consumer Groups 时,我可以考虑以下两种模式。
如图所示:
案例 1:每个主题都有自己的消费者组
案例 2:所有主题都有一个共同的消费者组
我知道,当一个主题有多个分区时,如果一个消费者失败,同一消费者组中的另一个消费者会接管该分区。
我的问题:
当多个主题共享同一个消费者组时,会发生同样的事情吗?即:如果消费者失败(HDFS Sink),另一个消费者(HDFS Sink 连接器)会接管工作并从该主题中读取吗?
更新:每个 Kafka HDFS Sink Connector 只订阅一个主题。
【问题讨论】:
【参考方案1】:绝对是的。 kafka 消费者应该监控这两个主题,然后,kafka 会将分区(每个主题)分配给消费者组的当前活动成员。
无论每个主题上是否有一个或多个分区,只要同一组中发生消费者故障,消费者将负责监控每个主题的分区。 当发生故障时,Kafka 将始终触发 重新平衡 过程,以便将分区分配给组中剩余的活动消费者,因此,工作将继续在该主题上运行。
【讨论】:
我的问题不在于重新平衡分区。它是关于是否针对同一消费者组中的不同主题进行重新平衡 答案是肯定的。如果消费者在两个主题上都注册/订阅了,那么当一个消费者失败时,他们将开始从另一个主题获取消息。【参考方案2】:是的,只要两个消费者都订阅()同一组主题(topicA 和 topicB),所有主题的分区将分布在所有消费者中。
在您的情况下,这意味着如果其中一个消费者失败,两个主题都将分配给幸存的消费者。
【讨论】:
在 Kafka Connect 中,每个消费者只订阅一个特定的主题。这种情况,不会有rebalance吧? 我不使用kafka connect,所以无法回答【参考方案3】:我很惊讶所有“是”的答案都是错误的。我刚刚对其进行了测试,对于 不同 主题的消费者使用相同的 group.id
效果很好,并不意味着他们共享消息,因为对于 Kafka,密钥是 (topic, group)
而不仅仅是 (group)
。这是我所做的:
-
创建了 2 个不同的主题 T1 和 T2,每个主题中有 2 个分区
在同一组中创建了 2 个消费者
xxx
将消费者 C1 分配给 T1,将消费者 C2 分配给 T2
向 T1 生成消息 - 只有分配给 T1 的消费者 C1 处理它们
向 T2 生成消息 - 只有分配给 T2 的消费者 C2 处理它们
杀死消费者 C1 并重复 4-5 步。只有消费者 C2 处理来自 T2 的消息
未处理来自 T1 的消息
结论:同组名订阅不同主题的消费者不会消费其他主题的消息,因为key是(topic, group)
【讨论】:
是的,这是我所期望的正确行为。我认为其他人认为我的消费者同时订阅了 T1 和 T2 。 @AshikaUmangaUmagiliya 随时接受正确答案 @borN_free 我认为没有人声称他们会看到他们不拥有的主题的记录。要完成您的实验,请尝试通过向其中一个主题添加分区来强制重新平衡,您将看到所有消费者(甚至那些不关心该主题的消费者)都停止重新平衡。 在步骤1中,如果你创建T1只有一个分区,T2还是两个,会发生什么?启动 Kafka 时,C2 抱怨没有足够的分区,即使 T2 已经足够了。你看到了吗? @borN_free 您能否分享一个代码示例,您是如何做到的?【参考方案4】:问的问题是如果消费者组中的消费者失败,同一组中可用的消费者是否会拿起订阅的主题并重新开始处理?。
但是接受的答案有将主题分配给消费者的场景,但如果它是自动分配(即订阅),那么组中空闲的消费者应该选择失败消费者的工作并从最后一个开始阅读承诺的偏移量。如果不是,那么它破坏了消费者组并行架构。
看看这个答案。 Kafka consumer for multiple topic
【讨论】:
我认为您在回答中将主题与分区混淆了以上是关于Kafka:使用普通消费者组访问多个主题的主要内容,如果未能解决你的问题,请参考以下文章
使用javaApi监控 kafka 集群的环境下消费组的积压信息