记一次与Kafka大神的交流

背景

线上某项目有三个实例同时从Kafka集群某topic消费数据,该topic有六个分区,每个实例的代码都是一样,都是开线程去消费数据。项目中数据消费下来会生成一个文本文件,之前由于没有部署多实例,所以只会生成一个文件,前段时间考虑国庆期间数据量会增大,就部署了多实例,今天发现并不是每个实例都生成了文件,只有一个实例正常生成了文件,另外两个实例都没有生成文件,实例状态都是正常的没有任何问题。

分析

今天发现问题的时候,我觉得很奇怪,理论是不应该会出现这个现象的。但是最后突然想起来每个实例开的是六个线程。这就能解释了,因为Kafka同一个topic的最大并发数是不能超过分区数量的。也就是说该topic有六个分区,最多也就只能有六个线程去消费,三个实例,每个实例六个线程,就是18个,必然有两个实例是消费不到数据的。

问题

那么就有一个问题了,那就是为什么刚好是第一个实例能消费数据,剩余的两个实例却没有消费到呢?

请教

发现了问题那么接下来就是解决问题了,自己解决不了,那自己就是找专业人士。经过在Kafka中国社区群里有人给了回答。

  • 之所以第一个实例能消费数据,剩余两个实例消费不到数据,是因为根据实例的启动顺序来的,第一个实例先启动,所以第一个实例的六个线程先消费数据,后启动的两个实例因为启动慢就没有办法消费到数据。

    这种说法看似能理解,也比较正常,但是有大神经过实验表示了质疑。

  • “scala consumer的默认分配策略是range,老版本range策略是根据consumer线程的名称进行排序,如果consumer B的线程名在词法上比A的线程名字要小,那么有可能出现B的6个线程来消费这些数据,而不是A” 一

二

三

四

总结

1、解决问题有时候可能很简单,难的往往是发现问题的根源。

2、在自己能力不足的时候要虚心请教别人,当自己能帮助别人的时候也不要吝啬