我们在AWS上运行16节点kafka群集,每个节点都是m4.xLarge EC2实例,具有2TB EBS(ST1)磁盘。 Kafka版本是0.10.1.0,目前我们有大约100个主题。一些繁忙话题每天将有大约20亿个事件,一些低容量主题每天只有几千个。
我们的大多数主题在生成消息时使用UUID作为分区键,因此分区的分布非常均匀。
我们使用消费者群体从此群集消费了大量消费者。每个消费者都有一个唯一的组ID。一些消费者组每500ms提交一次偏移,有些消费者组会在完成处理一批消息后立即提交偏移量。
最近我们观察到某些经纪人比其他经纪人忙得多的行为。通过一些挖掘,我们发现,实际上有很多流量进入“__consumer_offsets”,因此我们创建了一个工具来查看“__consumer_offsets”中每个分区的高水印,这表明分区的分布非常不均匀。 / p>
基于此链接"Consumer offset management in Kafka"
这似乎是一个预期的行为,每个消费者群体只有一个领导者,因此承诺抵消所有需要去这个领导者,并且也只使用“group.Id”来决定分区。
鉴于我们有一些消费者从那些非常繁忙的主题消费,因此提交抵消将导致处理消费者组的代理上的“__consumer_offsets”主题有很多流量。
我的问题是:
1.有没有办法可以确保消耗繁忙主题的消费者群体不会落在同一个经纪人身上?不要'想要创建一个热点。
提前致谢
答案 0 :(得分:0)
关于问题#1,至少在Kafka-1.0.0中无济于事,它以这种方式计算分区“ Utils.abs(groupId.hashCode)%groupMetadataTopicPartitionCount”。因此,对于相同的组ID,它将属于相同的分区。
对于问题2,首先,您的消费者是否可以赶上生产者的速度。可以使用单个消费者。如果消费者滞后持续增加,那么您应该考虑使用组来加快速度。您应该记住,一组中的最大使用者受您从中使用的主题的分区数限制。其次,从消费者的角度来看,该组也可以用作HA解决方案。