我有多个消费者都使用同一个group.id收听某个特定主题。主题有一个分区。
我的理解是,来自同一消费者组(由idential group.id标识)的消费者将以循环方式获取消息,这样一条消息就只能由一个消费者处理。消费者在不同的机器上运行不同的windows服务。
消费者是用c语言编写的,基于confluent的ApacheKafka.net客户端。
配置如下所示:
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"}
}
}
};
不过,我的经验是,所有消费者都会收到相同的信息。从consumer中,我记录了有关接收到的消息的信息,在这里我看到多个日志条目具有相同的消息、主题、偏移量和分区。
这是预期的行为吗?
2条答案
按热度按时间xwbd5t1u1#
我认为你误解了分区和消费者之间的关系。基本上只有一个使用者从一个分区读取数据。
下面我将展示从kafka中提取的图像中消费者和分区之间的关系:我强烈建议您阅读的最终指南,特别是第4章:kafka消费者。
下图显示了一个从多个分区读取的使用者。如果一个新的使用者注册到系统中,那么负载将被平衡,这样两个使用者都将从两个不同的分区读取数据。
下面的最后一个图像显示了当使用者的数量大于分区的数量时会发生什么。基本上1个消费者将处于空闲状态。
请记住,我们有属于某个消费群体的消费者。该特定标志将决定用于将使用者分配到主题分区的策略。默认情况下有两种策略:范围和循环。
camsedfj2#
在一个组中,只能有一个使用者分配给一个分区(并接收消息)。
如果您的使用者(都在同一个组中)只订阅了一个具有单个分区的主题,则只有其中一个使用者将从该主题接收消息。所有其他使用者都将处于空闲状态,准备在分配的使用者终止、崩溃或创建更多分区时接管。
这个
roundrobin
配置用于分区分配,而不是消息。你所描述的看到的听起来不对。
您确定消费者都属于同一组吗?你能通过运行以下命令来检查Kafka的状态吗