Kafka如何向许多消费者群体广播

时间:2014-04-17 14:52:41

标签: apache-kafka

我是Kafka的新手,我将非常感谢下一个案例。

Kafka文档在“消费者职位”一节中说:

  

“我们的主题分为一组完全有序的分区,每个分区   其中一个消费者在任何特定时间消费。“

基于上述声明,如果很少有消费者组订阅某个主题,而生产者将在此主题中向特定分区发布消息,那么只有一个消费者可以提取消息。

问题是如果只有一个消费者可以提取特定消息,那么许多消费者群体的广播可能会如何发生?

4 个答案:

答案 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)

好问题。enter image description here

举一个例子,我有一个名为投诉的主题有两个分区 p1,p2

现在我有两个名为 group1 的消费者群体,其中有两个消费者 c1 c2 group2 消费<强> C3

在这里,我路由来自 p1 的消息应该转到 c1 p2 应该转到 c2 并且我订阅了另一个名为 c3 的消费者,但是在不同的群组中,所以此处整个消息的副本也会发送给该消费者

答案 3 :(得分:2)

通常有两种消息传递模式:

  1. 共享队列: 所有使用者都订阅一个消息队列。每个消费者彼此竞争,对于每条消息,只有一个消费者会得到。
  2. 发布-订阅: 每个消息都广播给所有订阅的消费者。因此,所有消费者都会收到相同的消息。

Kafka通过消费者群体的概念同时支持两者。 同一组中的使用者遵循共享队列模式。群组中只有一个消费者可以收到消息。

不同的消费群体遵循发布-订阅模式。对于每条消息,所有订阅该主题的消费者组都将获得该消息的副本。

有用的参考: https://dzone.com/articles/dont-use-apache-kafka-consumer-groups-the-wrong-wa