kafka节点的消息顺序错误

Wrong message order with kafka-node

本文关键字:顺序 错误 消息 节点 kafka      更新时间:2023-09-26

我使用的是kafka node.js库。当使用250k条消息(以2000条消息为一批加载到Kafka中)和新启动(zookeeper中没有偏移)来消费主题时,我的消息顺序有问题。使用者通常不处理偏移量为0的消息,而是从4000或8000左右开始。此外,它会连续处理1000条消息块,并在稍后或更早的N*1000偏移量处跳转。我已经尝试将maxTickMessages更改为800,它处理块od800消息,但它仍然跳到N*1000偏移。我在调试日志中找不到缺少的200个偏移。将maxTickMessages或maxNumSegments更改为非常大的数字没有帮助。

我在Kafka二进制协议解码器中直接打印当前消息偏移量,这应该会消除一些潜在的异步影响。请参阅Offset日志和使用的代码kafka-order-test.js。我认为kafka二进制协议解析有问题,但我没能在其中找到问题。

Kafka本身不应该是一个问题,因为我用kafkacat抛弃了主题,它保持了正确的偏移量和消息顺序。我还使用Wireshark监控了node.js-Kafka网络流量,消息按正确顺序显示。

此问题是由异步嵌套MessageSet解压缩引起的,该解压缩导致无序的消息消耗。Kafka在MessageSet中返回消息,其中包含2000条消息的嵌套压缩MessageSet(在我的测试中)。不幸的是,解压缩是异步的,没有任何同步,因此消息被按最大2000的批量处理(取决于maxTickMessages)。我的修复程序应用同步解压缩。