Kafka Consumer 执行 poll 操作时获取空数据的原因分析

  • Post author:
  • Post category:其他




1. 场景:

当用户需要获取数据时,后端从指定 topic 下消费1条数据;每次操作的间隔为 0~∞



2. 现象:

每隔一段时间,在kafka消费数据时,会出现获取数据为空的情况



3. 问题排除路径:

  1. 由于 Topic 中的数据很多,不可能出现数据被取光的情况,首先怀疑是网络问题;在协调运维帮忙检查后发现,kafka运行正常,没有发现异常;
  2. 假设网络拥堵,导致 poll() 超时,那么就增大该操作的等待时间,将 consumer.poll.timeout.ms 从“100”设置为“500”,但问题仍未解决;
  3. 观察日志,发现当发生“Reblance”时,手动提交消费偏移量, 此时偏移值远远超过实际消费的数据量,当只消费了几十条数据时,此时的偏移量 offset 的值为几十万,说明中间的这些数据已经被消费过了;
  4. 是不是代码中有个线程没有关闭一直在消费数据?在检查了一遍代码后,没有发现这个异常线程;
  5. 最后,定位到问题,topic数据默认保存时间为 7 天。



4. 总结经验

  1. kafka只是一个消息队列,应该能够判断出公司的kafka对于数据不会进行持久化存储;
  2. 当得到运维给出的无异常回复后,应能够判断出不是“玄学”的网络问题,特别是在仔细检查完代码后;
  3. 对 kafka 掌握不够全面,不了解其清理过期数据的机制,导致在看到offset的“异常值”后,没有迅速判断出是过期策略的问题。



5. 遗留问题

多个topic同时消费数据,

经常

出现“获取数据失败”的问题。



版权声明:本文为weixin_37392582原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。