使用kafka-node的错误消息顺序

时间:2016-01-07 23:27:09

标签: javascript node.js apache-kafka kafka-consumer-api

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

我在Kafka二进制协议解码器中直接打印当前消息偏移,这应该消除一些潜在的异步效应。请参阅Offset log并使用代码kafka-order-test.js。我认为Kafka二进制协议解析存在问题,但我无法在其中找到问题。

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

1 个答案:

答案 0 :(得分:0)

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