【问题标题】:How Kafka broadcast to many Consumer GroupsKafka 如何向多个 Consumer Group 广播
【发布时间】:2014-06-01 22:09:18
【问题描述】:

我是 Kafka 的新手,非常感谢您对下一个案例的澄清。

Kafka 文档在“消费者位置”段落中说:

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

根据上面的说法,如果少数消费者组订阅了一个主题,而生产者将向该主题内的特定分区发布消息,那么只有一个消费者可以拉取消息。

问题是,如果只有一个 Consumer 可以提取特定消息,如何向多个 Consumer Group 广播?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    一般有两种消息模式:

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

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

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

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

    【讨论】:

      【解决方案2】:

      好问题。

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

      现在我有两个名为 group1 的消费者组有两个消费者 c1c2group2 有消费 c3

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

      【讨论】:

        【解决方案3】:

        如果一个主题有 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 个流之间重新平衡。每个消费者可以同时从多个流中消费。请注意,这里的流和分区的数量是相等的。如果流的数量超过分区,则某些流将不会收到任何消息,因为它们不会被分配任何分区。

        如果有另一个消费者组,相同的过程将应用于该消费者组内的消费者

        【讨论】:

        • 我不知道为什么这个答案没有被接受。这描述了理解 Kafka 中的分区/消费者关系的一个非常关键的方面。
        • 版主实际上删除了我的答案,因为我发布了一个指向我的文章的链接,该链接更详细地描述了这一点。很遗憾,但 StackOverflow 似乎就是这样工作的。
        • 当我阅读“每个消费者使用多个流”模型时,我并不清楚。没有错,只是不清楚。我像这样给自己重新写了一遍:
        • 当我阅读上面的第二个模型时,我并不清楚(不是说错了)。 =:) 所以我重新给自己写了一遍,强调“same 消费者组中的不同消费者不能从相同的分区消费。因此,重新平衡是分配一些分区集合的行为,这些分区专门用于消费者组中的一个消费者;以及一个不同的分区集合,专门为组中的下一个消费者提供服务;等等。如前所述,“相同的流程适用于不同消费群体中的消费者”。我希望这个解释是正确的。
        【解决方案4】:

        consumer group 中只有一个消费者可以拉取消息。但是所有 consumer groups 收到消息。

        因此,如果您希望所有消费者都收到消息,请为它们分配不同的consumer groups。每条消息都会发送到每个消费者组,但在一个组内,它只发送给一个消费者。

        阅读Consumer 部分here

        【讨论】:

        • 感谢您的回答。我确实读过有关消费者群体的概念。这就是为什么我对“每个分区一个消费者”的说法感到困惑,这种说法在文档中不断重复,而没有提及消费者组。特别是如果我阅读了有关分区偏移的信息。每个主题的多个消费者组假定每个主题的分区有多个偏移量。不是吗?
        • 您的说法“消费者组中只有一个消费者可以拉取消息”并不完全正确。每个分区只能被一个消费者消费。因此,如果一个 Consumer Group 中有多个消费者,他们仍然可以从不同的分区消费。这就是 Kafka 并行消费的全部意义
        • @gaganbm 如果我们有许多分区和许多消费者组,每个消费者只有一个消费者,那么 Kafka 如何在以下情况下扩展。我们添加了更多的消费者组并且分区的数量是恒定的 b.我们添加了更多的消费者组并且我们添加了更多的分区?放大是线性的还是亚线性的?提前致谢
        • @java_geek 这句话是完全正确的,因为一条消息只在一个分区中排队,永远不会在多个分区中。因此,从您在评论中描述的行为来看,一条消息只能由消费者组中的一个消费者接收。
        猜你喜欢
        • 2017-06-20
        • 2018-03-17
        • 2018-09-15
        • 1970-01-01
        • 2021-09-06
        • 2020-11-13
        • 2019-07-01
        • 2023-03-02
        • 2015-08-24
        相关资源
        最近更新 更多