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