【问题标题】:Expected behaviour for multiple consumers with same group.id for a topic with single partition对于具有单个分区的主题,具有相同 group.id 的多个消费者的预期行为
【发布时间】:2017-12-29 04:05:25
【问题描述】:

我有多个具有相同 group.id 的消费者都在监听特定主题。主题有一个分区。

据我了解,来自同一消费者组(由相同的 group.id 标识)的消费者将以循环方式获取消息,这样消息仅由单个消费者处理。消费者在不同机器上的不同 Windows 服务中运行。

消费者是用 C# 编写并基于Confluent's Apache Kafka .NET client

配置如下:

        var config = new Dictionary<string, object>
        {
            {"group.id", "MyConsumerGroupId"},
            {"enable.auto.commit", true},
            {"auto.commit.interval.ms", 5000},
            {"log.connection.close", false},
            {"session.timeout.ms", 30000},
            {"heartbeat.interval.ms", 5000},
            {"queued.min.messages", 1000},
            {"partition.assignment.strategy", "roundrobin"},
            {"bootstrap.servers", _kafkaCluster},
            {
                "default.topic.config", new Dictionary<string, object>
                {
                    {"auto.offset.reset", "largest"}
                }
            }
        };

但是,我确实体验到所有消费者都会收到相同的消息。我从消费者那里记录了有关收到的消息的信息,在这里我看到多个具有相同消息、主题、偏移量和分区的日志条目。

这是预期的行为吗?

【问题讨论】:

  • 实际上,如果所有消费者都属于同一个 groupid,您会收到相同的消息,这很奇怪。但是,当您说:“消费者在不同机器上的不同 Windows 服务中运行。”这到底是什么意思?

标签: c# apache-kafka kafka-consumer-api


【解决方案1】:

我认为你误解了分区和消费者之间的关系。本质上,1 个消费者只会从 1 个分区中读取数据。

下面我展示了从 Kafka: The Definitive Guide 中提取的图像中消费者和分区之间的关系,我强烈建议您阅读,特别是第 4 章:Kafka 消费者

下图显示了从多个分区读取的 1 个消费者。如果一个新的消费者注册到系统,那么负载将被平衡,以便两个消费者将从 2 个不同的分区读取数据。

下面的最后一张图片显示了当消费者数量大于分区数量时会发生什么。基本上 1 个消费者将处于空闲状态。

> partition.assignment.strategy

请记住,我们有属于消费者组的消费者。该特定标志将决定用于将消费者分配到主题分区的策略。默认有 2 种策略:RangeRoundRobin

【讨论】:

  • 我想我确实理解消费者和分区之间的关系。但是在实践中,我看到/经历了上述情况,它不符合文档。所以我只是想了解我做错了什么。谢谢。
  • 那我觉得你的问题有一部分有点不清楚:“我觉得这个有点不清楚:”据我了解,消费者来自同一消费群体(由相同的group.id标识)将以循环方式获取消息,以便消息仅由单个消费者处理。”
【解决方案2】:

在一个组中,只能有 1 个消费者分配给一个分区(并接收消息)。

如果您的消费者(都在同一个组中)只订阅了一个具有单个分区的主题,那么其中只有一个会收到来自该分区的消息。所有其他消费者将处于空闲状态,准备好在分配的消费者终止或崩溃或创建更多分区时接管。

roundrobin 配置用于分区分配,而不是用于消息。

您所描述的所见内容听起来不正确。

您确定消费者都在同一个组中吗? 您可以通过运行检查 Kafka 的状态:

/bin/kafka-consumer-groups.sh --zookeeper ZOOKEEPER --describe --group MyConsumerGroupId

【讨论】:

  • 谢谢。一旦我能够根据 Kafka 检查状态,我就会回来。
猜你喜欢
  • 1970-01-01
  • 2020-06-27
  • 2014-05-21
  • 1970-01-01
  • 2021-12-04
  • 2017-12-23
  • 2020-02-10
  • 2018-11-06
  • 1970-01-01
相关资源
最近更新 更多