前言:
此刻朋友们对“kafka发送消息失败常见原因”可能比较关怀,小伙伴们都想要分析一些“kafka发送消息失败常见原因”的相关资讯。那么小编同时在网上汇集了一些有关“kafka发送消息失败常见原因””的相关文章,希望你们能喜欢,同学们一起来学习一下吧!今天测试环境出现了一个Kafka发送消息的问题,排查了好长时间才解决,记录一下
问题症状
测试环境突然出现发送Kafka消息失败的错误Magic v1 does not support record headers,
错误截图如下:
在网上查一下,很多人都说是Kafka服务端和客户端的版本不兼容导致了报错,于是朝着这个方向去排查问题
服务端版本确认
找运维的同学确认是否动过服务端的Kafka版本,因为之前一直正常运行了很长时间,今天突然出现了这个问题,肯定是有人动过什么东西。 运维的同学确认没有动过服务端的Kafka版本,服务端版本问题排除
客户端版本确认
查找git提交记录,看是否有研发的同学修改过Kafka客户端的版本,最后也发现没有修改过版本,那就尴尬了。客户端和服务端都没有动过版本,那为啥会报这个错误呢?之前运行过很长时间,说明版本肯定是兼容的,今天突然出现问题肯定还是有人动了什么东西
找到真凶
在排除服务端和客户端版本不兼容的问题后,就试着看了一下报错处的源码
if (magic < RecordBatch.MAGIC_VALUE_V2 && headers != null && headers.length > 0) throw new IllegalArgumentException("Magic v" + magic + " does not support record headers");
从源码可以看出来,除了判断版本以外,还进行了headers的判断,说明发送的消息必须带了请求头才会报这个错误,但奇怪的是我们在发送消息给Kafka的时候并没有添加请求头,这说明有额外的东西在往请求里面添加请求头,才导致了这个问题
发现网上也有人提到请求头里面带了参数,才会导致这个问题,比如:
问题到这里似乎有些眉目了,应该是某些应用在请求里面强行加了参数,于是找到架构的同学帮忙分析了一下,发现今天确实在测试环境增加了SkyWalking的分布式追踪应用,貌似这个应用会在头部增加参数,具体的也不太懂,最后把SkyWalking拿掉,马上就恢复正常了。
总结
当出现这个问题时,一般会有两个原因
比如你是在搭项目框架的时候出现这个问题,那大概率是因为版本的原因,可以从版本方面来解决这个问题
如果你是在运行比较久的系统里面突然出现了这个问题,那大概率是因为你在头部加了某些参数,当然在头部加参数也是可以通过升级Kafka版本来解决的,只是如果你的版本刚好不支持,就可以从这方面找一下原因
标签: #kafka发送消息失败常见原因