NodeJS Kafka Consumer是否收到重复消息?

时间:2019-07-10 16:42:02

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

我在NodeJS应用程序中使用Kafka-Node来生成和使用消息。我开始等待一个主题的消费者。然后,我启动生产者并将消息发送给Kafka。我的消费者正在将这些消息中的每条消息插入Postgres数据库中。

对于单个消费者,这很好。

当我停止使用者并继续生产时,大约30秒后我会重新启动使用者。我注意到大约有十几条消息已经从原始使用者处插入到数据库中。

我假设当我杀死消费者时,还有一些尚未兑现的补偿,这就是第二位消费者选择它们的原因?

处理这种情况的最佳方法是什么?

var kafka = require('kafka-node');
var utilities = require('./utilities');
var topics = ['test-ingest', 'test-ingest2'];
var groupName = 'test';

var options = {
    groupId: groupName,
    autoCommit: false,
    sessionTimeout: 15000,
    fetchMaxBytes: 1024 * 1024,
    protocol: ['roundrobin'],
    fromOffset: 'latest',
    outOfRangeOffset: 'earliest'
};

var consumerGroup = new kafka.ConsumerGroup(options, topics);

// Print the message
consumerGroup.on('message', function (message) {

    // Submit our message into postgres - return a promise
    utilities.storeRecord(message).then((dbResult) => {

        // Commit the offset
        consumerGroup.commit((error, data) => {
            if (error) {
                console.error(error);
            } else {
                console.log('Commit success: ', data);
            }
        });

    });

});

1 个答案:

答案 0 :(得分:0)

我不知道为什么fromOffset: 'latest'对您不起作用。一个简单的解决方法是使用offset.fetchLatestOffsets来获取最新的偏移量,然后从该点开始消耗。