kafka-node的几个消费者

时间:2017-02-02 13:31:31

标签: node.js apache-kafka

有一个基本的例子就像1个消费者的魅力一样。它接收消息。但是添加一个额外的消费者将被忽略。

let kafka = require('kafka-node');
let client = new kafka.Client();

let producer = new kafka.Producer(client);

let consumer1 =  new kafka.Consumer(client,[ {topic: 'topic1', partition: 0}]);
let consumer2 =  new kafka.Consumer(client,[ {topic: 'topic2', partition: 0}]);


producer.on('ready', function () {

    producer.send([{topic:'topic1', messages: 'topic 1 msg' ], (err,data)=>{
        console.log(err,'1 sent');
    });
    producer.send([{topic:'topic2', messages: 'topic 1 msg'}], (err,data)=>{
        console.log(err, '2 sent');
    });

});
producer.on('error', function (err) {
    console.log('err', err);
})



consumer1.on('message',(message) =>{
    console.log(11, message);
});
consumer2.on('message',(message) =>{
    console.log(22, message);
})

对于consumer2,事件为'22'的事件永远不会触发。如果我使用命令行工具检查该主题的数据

1 个答案:

答案 0 :(得分:4)

您忘记在使用者参数中添加使用者组。在您的情况下,两个消费者都属于一个消费者组(默认情况下称为kafka-node-group)。拥有一个消费者群体意味着每个消费者群体将传递一次消息。由于您的主题有0个分区,因此只有第一个消费者会处理该消息。

如果要向两个消费者发送相同的消息,则必须有两个消费者组(每个组一个消费者)。您可以按照way

执行此操作
let consumer1 =  new kafka.Consumer(client,[ {topic: 'topic1', partition: 0}], {groupId: 'group1'});
let consumer2 =  new kafka.Consumer(client,[ {topic: 'topic2', partition: 0}], {groupId: 'group2'});

如果您希望消费者一起处理消息(按分区),则需要增加主题中的分区数。