起因
新起了一个业务,用flink消费实时集市kafka消息,在测试环境跑的好好的,验证也过了,然后上线。
刚上线的当天也好好的,晚上突然在某个点,就拉取不到消息了,上游一直有消息下来,但flink就是没接收到消息,而且checkpoint也能成功,但是消息的位置点却并没有提交,flink处于空转状态,日志也没有任何报错。
经过
根据以往经验,先怀疑某个消息有问题,无法消费。于是通过重置位置点跳过一段offset重启flink,但是效果依然如此。
然后重新申请消费组并重启flink,虽然可以消费一段时间,但是依然会卡到某个点就处于空转的状态。日志依然没有任何有效提示,checkpoint继续。。。。。
然后又检查了集群,看cpu核数,内存等,都没有问题,完全是富足的。
崩溃了,于是询问其他消费这个topic的同事,看看是否他们的消费也是如此,经询问,他们的没有任何问题,消息消费顺畅。
啊,难道是智子在搞我?
于是,我直接对比与同事的代码,终于在maven依赖中看到了我们的不同,他们用的kafka clients版本是2.3.0的,我的版本却是0.8的,终于真相大白。
公司统一封装了一个kafka消费基础包他们里面依赖的0.8,but线上的kafka集群却是2.3的,同事们之前已经遇到这个坑,没想到被我再踩了一次,多么痛的领悟!
结果
flink空转不是flink的问题,而是kafka客户端版本与集群版本不匹配导致的,然而最要命的是在flink空转无法消费时,看不到任何报错信息,都没有排查的方向。你就报个错,或者说直接启动不起来也好啊,关键它还可以消费一段时间。这就不好排查了。
它山之石,可以攻错,今天写下此文,希望为后来的同行提供一个排查问题的方向,虽然这个问题是一个看起来很傻逼的问题,但是一旦遇到了,就真的是遇到了!尤其当人家给你封装个什么jar包,你完全不会考虑有版本的问题。
当然为啥版本不匹配导致这种bug,还没来得及研究。