有没有办法让kafka-node在崩溃后请求收到的消息?

时间:2018-04-13 15:46:17

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

我一直在看码头,现在想知道这是否是kafka或node-kafka的特征。

所以我的消费者收到了来自kafka的消息,当我处理消息时,我喜欢将其标记为好像我没有得到它,直到我完成处理它。这样,如果服务器在处理过程中崩溃,我可以重新连接并接收我的应用程序在崩溃之前收到的消息。

高级示例。

  1. Kafka消息是用户ID;
  2. 收到后,我会从数据库中获取用户信息。
  3. 我向用户发送了一封电子邮件。
  4. 发送电子邮件时。我将其登录到数据库。
  5. 我标记了邮件已完成。 (我不确定这一步是否可行)
  6. 这样,如果任何步骤在第5步之前崩溃,则当服务器备份时,它会再次收到失败的消息。

    我正在使用node.js LTS 8.10.0和npm包kafka-node@2.4.1

2 个答案:

答案 0 :(得分:2)

我赞成无效,因为他的回答帮助我找到了我在kafka-node中所需要的东西。这里只是node.js的回答/示例。

const kafkaConfig = config.get('kafka');
const kafkaClient = new kafka.KafkaClient({kafkaHost: kafkaConfig.host});
const consumer = new kafka.Consumer(kafkaClient, [{topic: kafkaConfig.topic}], {autoCommit: false});
const offset = new kafka.Offset(kafkaClient);

// very import to retrieve the offset
offset.fetchLatestOffsets([kafkaConfig.topic], (error, offsets) => {
    const latestOffset = offsets[kafkaConfig.topic][0];
    consumer.setOffset(kafkaConfig.topic, 0, latestOffset);
});

consumer.on('message', message => {
    // do stuff
    Log.insert({message})
        .then(() => {
            // commit the success so that kafka will update the offset
            consumer.commit((err, data) => console.log(err, data));
        })
});

答案 1 :(得分:1)

执行此操作的方法是将上次读取的偏移量保存到您喜欢的数据库中。这样,您可以使用此偏移量从下次重新启动时启动您的使用者。

Kafka提供了一种内置版本> 0.8的机制。 Kafka将消费者组读取的最新偏移量存储到名为consumer_offsets的内部主题中。大多数客户端库都有自动提交最后处理的偏移量的规定,或者您可以选择禁用自动提交并在整个处理完成后自行提交偏移量。