对于具有单个分区的主题,具有相同group.id的多个使用者的预期行为

时间:2017-12-28 11:18:24

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

我有多个消费者都使用相同的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"}
                }
            }
        };

但是我确实经历过所有消费者得到相同的消息。从消费者我记录有关收到的消息的信息,在这里我看到多个日志条目具有相同的消息,主题,偏移和分区。

这是预期的行为吗?

2 个答案:

答案 0 :(得分:0)

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

如果您的消费者(所有在同一组中)仅订阅了具有单个分区的主题,则其中只有一个将从其接收消息。所有其他消费者将处于空闲状态,准备接管,以防分配的消费者终止或崩溃或创建更多分区。

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

你所描述的看法听起来不对劲。

您确定消费者都在同一个群体中吗? 你可以通过运行来检查卡夫卡的状态:

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

答案 1 :(得分:0)

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

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

Exactly one-one relationship between consumers and partitions

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

enter image description here

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

enter image description here

> partition.assignment.strategy

请记住,我们有属于Consumer组的消费者。该特定标志将决定用于将消费者分配给主题分区的策略。默认情况下有两种策略:范围 RoundRobin

相关问题