我是Kafka的新手,我将非常感谢下一个案例。
Kafka文档在“消费者职位”一节中说:
“我们的主题分为一组完全有序的分区,每个分区 其中一个消费者在任何特定时间消费。“
基于上述声明,如果很少有消费者组订阅某个主题,而生产者将在此主题中向特定分区发布消息,那么只有一个消费者可以提取消息。
问题是如果只有一个消费者可以提取特定消息,那么许多消费者群体的广播可能会如何发生?
答案 0 :(得分:22)
如果一个主题有10个分区,并且3个消费者实例(C1,C2,C3按此顺序启动)都属于同一个消费者组,我们可以使用不同的消费模型,允许读取并行性,如下所示
每个消费者使用一个流。 在此模型中,当C1启动时,主题的所有10个分区都映射到同一个流,并且C1开始从该流中消耗。当C2启动时,Kafka重新平衡两个流之间的分区。因此,每个流将分配到5个分区(取决于重新平衡算法,它可能也是4对6)并且每个消费者从其流消耗。类似地,当C3启动时,分区再次在3个流之间重新平衡。请注意,在此模型中,当从分配给多个分区的流中进行消费时,消息的顺序将在分区之间混乱。
每个消费者使用多个流(比如C1使用3,C2使用3,C3使用4)。 在此模型中,当C1启动时,所有10个分区都分配给3个流,C1可以使用多个线程同时从3个流中消耗。当C2启动时,分区在6个流之间重新平衡,类似地,当C3启动时,分区在10个流之间重新平衡。每个消费者可以同时从多个流中消费。请注意,此处的流和分区数相等。如果流的数量超过分区,则某些流将不会获得任何消息,因为它们不会被分配任何分区。
如果有另一个消费者群体,则对该消费者群体中的消费者应用相同的流程
答案 1 :(得分:20)
consumer group
中只有一位消费者可以提取消息。但所有 consumer groups
都会收到消息。
因此,如果您希望所有消费者都能收到消息,请为他们分配不同的consumer groups
。每条消息都发送给每个消费者群体,但在一个群组中,它只发送给一个消费者。
阅读Consumer
部分here。
答案 2 :(得分:2)
举一个例子,我有一个名为投诉的主题有两个分区 p1,p2
现在我有两个名为 group1 的消费者群体,其中有两个消费者 c1 且 c2 且 group2 消费<强> C3 强>
在这里,我路由来自 p1 的消息应该转到 c1 而 p2 应该转到 c2 并且我订阅了另一个名为 c3 的消费者,但是在不同的群组中,所以此处整个消息的副本也会发送给该消费者
答案 3 :(得分:2)
通常有两种消息传递模式:
Kafka通过消费者群体的概念同时支持两者。 同一组中的使用者遵循共享队列模式。群组中只有一个消费者可以收到消息。
不同的消费群体遵循发布-订阅模式。对于每条消息,所有订阅该主题的消费者组都将获得该消息的副本。
有用的参考: https://dzone.com/articles/dont-use-apache-kafka-consumer-groups-the-wrong-wa