卡夫卡(Kafka)消息由于后来的消息而丢失

时间:2019-05-16 21:14:11

标签: apache-kafka message offset kafka-consumer-api

所以我的kafka消费者遇到了一些烦人的抵消提交案。 我在项目中使用“ kafka-node”。 我创建了一个主题。 在2个服务器的使用者组中创建了2个使用者。 自动提交设置为false。 我的使用者收到的每条消息,都会启动一个异步过程,该过程完成后,使用者将提交偏移量,该过程可能需要1到20秒。 我的问题是: 有一种感觉, 使用者1收到一条消息,并需要20秒来处理。 在此过程的中间,他会收到另一条消息,需要1秒钟来处理。 他完成了第二条消息处理,提交了偏移量,然后立即崩溃。 导致先前的消息处理失败。 如果我重新运行使用者,他将不会再读取第一条消息,因为第二条消息已经提交了大于第一条的offsst。 我如何避免这种情况?

Kafkaconsumer.on('message', async(message)=>{
await SOMETHING_ASYNC_1~20SEC;
Kafkaconsumer.commit(()=>{});
});

1 个答案:

答案 0 :(得分:0)

您实质上想利用async.queue来限制消息并处理并发。

  1. 使用消息处理器和并发一个创建一个async.queue(消息处理器本身被setImmediate包装,因此不会冻结事件循环)
  2. 设置queue.drain以恢复消费者
  3. 使用者的message事件处理程序暂停使用者并将消息推送到队列。

kafka节点自述文件详细信息this here

与您的问题类似的示例实现可以在here中找到。