我有多个消费者都使用相同的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"}
}
}
};
但是我确实经历过所有消费者得到相同的消息。从消费者我记录有关收到的消息的信息,在这里我看到多个日志条目具有相同的消息,主题,偏移和分区。
这是预期的行为吗?
答案 0 :(得分:0)
在一个组中,只能有一个消费者分配给一个分区(和接收消息)。
如果您的消费者(所有在同一组中)仅订阅了具有单个分区的主题,则其中只有一个将从其接收消息。所有其他消费者将处于空闲状态,准备接管,以防分配的消费者终止或崩溃或创建更多分区。
roundrobin
配置用于分区分配,而不是用于消息。
你所描述的看法听起来不对劲。
您确定消费者都在同一个群体中吗? 你可以通过运行来检查卡夫卡的状态:
/bin/kafka-consumer-groups.sh --zookeeper ZOOKEEPER --describe --group MyConsumerGroupId
答案 1 :(得分:0)
我认为你误解了分区和消费者之间的关系。基本上1个消费者将从1个分区读取数据。
下面我将展示从 Kafka:The Definitive Guide 中提取的图像中的消费者和分区之间的关系,我强烈建议您阅读,特别是第4章:Kafka消费者。
下图显示1来自多个分区的消费者阅读。如果一个新的消费者注册到系统,那么负载将被平衡,以便两个消费者将从两个不同的分区读取数据。
下面的最后一张图显示了当消费者数量大于分区数量时会发生什么。基本上1个消费者将闲置。
> partition.assignment.strategy
请记住,我们有属于Consumer组的消费者。该特定标志将决定用于将消费者分配给主题分区的策略。默认情况下有两种策略:范围和 RoundRobin 。