1. 场景:
当用户需要获取数据时,后端从指定 topic 下消费1条数据;每次操作的间隔为 0~∞
2. 现象:
每隔一段时间,在kafka消费数据时,会出现获取数据为空的情况
3. 问题排除路径:
- 由于 Topic 中的数据很多,不可能出现数据被取光的情况,首先怀疑是网络问题;在协调运维帮忙检查后发现,kafka运行正常,没有发现异常;
- 假设网络拥堵,导致 poll() 超时,那么就增大该操作的等待时间,将 consumer.poll.timeout.ms 从“100”设置为“500”,但问题仍未解决;
- 观察日志,发现当发生“Reblance”时,手动提交消费偏移量, 此时偏移值远远超过实际消费的数据量,当只消费了几十条数据时,此时的偏移量 offset 的值为几十万,说明中间的这些数据已经被消费过了;
- 是不是代码中有个线程没有关闭一直在消费数据?在检查了一遍代码后,没有发现这个异常线程;
- 最后,定位到问题,topic数据默认保存时间为 7 天。
4. 总结经验
- kafka只是一个消息队列,应该能够判断出公司的kafka对于数据不会进行持久化存储;
- 当得到运维给出的无异常回复后,应能够判断出不是“玄学”的网络问题,特别是在仔细检查完代码后;
- 对 kafka 掌握不够全面,不了解其清理过期数据的机制,导致在看到offset的“异常值”后,没有迅速判断出是过期策略的问题。
5. 遗留问题
多个topic同时消费数据,
经常
出现“获取数据失败”的问题。
版权声明:本文为weixin_37392582原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。