公司有个项目在用kafka同步数据,详细背景就不交代了,客户端版本0.9.0.1,自动提交offset,发现程序在kafka拉不到消息时poll每次都提示如下信息及报错:
由于项目环境及代码均在公司内网,详细日志无法贴出来,基本就是:
........................ Marking the coordinator 11111111111 dead.
........................ Error UNKNOWN_MEMBER_ID occurred while committing offsets for group ggggggg
........................ Auto offset commit failed: Commit cannot be completed due to group rebalance
........................ Error UNKNOWN_MEMBER_ID occurred while committing offsets for group ggggggg
........................ Auto offset commit failed:
........................ Attempt to join group gggggggg failed due to unknown member id, resetting and retrying.
翻边网络均没找到有效解释和方案,于是各种参数测试,最终结论:
项目代码如果poll结果为空,则沉睡30s,然后下一次poll,同时kafka消费者设置的心跳间隔时间较小(3s),个人理解为kafka消费端注册的心跳间隔为3s,3s内未有效活动则认为该消费者宕机,当该消费端下一次poll(有效活动)连接时,kafka认为有新消费者加入,于是重新平衡消费群组。(此处有疑问,网上的kafka讲解似乎都是消费者主动发起心跳给kafka(coordinator),但是这里我感觉像是coordinator检测消费者是否在该心跳间隔内有效活动。如有比较清楚的同学,请指点一下,谢谢!)
于是,调整kafka消费者心跳间隔时间大于poll间隔时间(注意poll后业务处理时间),该问题不再出现。
---------------奇怪的是只有把代码中休眠时间降低到2s才正常,其他小于kafka心跳间隔的时间还是偶尔提示错误,后续再细研究下补上来。 |