KAFKA-NODE:管理多个消费者群体

时间:2018-07-12 14:04:17

标签: node.js apache-kafka

我有一个关于管理多个CG的问题,创建了三个消费者组,每个CG都有自己的kafka服务,组ID和主题。

现在我正在按预期方式接收消息,但是,我想知道是否有可能创建下一个场景:

创建三个消费者组,但仅接收来自一个消费者组的消息,如果暂停其kafka服务,则暂时使其他人处于暂停/保持状态,使用来自下一个消费者组的消息,与第三个消费者组相同。

以下是我的代码示例:

function createConsumerGroup(topics){

    const ConsumerGroup = kafka.ConsumerGroup;

    //CREATE CONSUMER GROUPS FOR EVERY SERVICE
    for(let i = 0; i < config.kafka_service.length ;i++){  //3

        const options = {
            groupId: config.kafka_service[i]['groupId'],
            host: config.kafka_service[i]['zookeeperHost'],
            kafkaHost: config.kafka_service[i]['kafkaHost'],
            sessionTimeout: 15000,
            protocol: ['roundrobin'],
            fromOffset: 'latest'
        }

        //assign all services CG names and create [i] consumer groups!
        let customConsumerGroupName = config.kafka_service[i]['consumerGroupName'];

        customConsumerGroupName = new ConsumerGroup(options, topics);

        customConsumerGroupName.on('connect', (resp) => {
            console.log(`${config.kafka_service[i]['consumerGroupName']} is connected!`);
        });

        if(i > 0){
            //pause consumers exept FIRST
            customConsumerGroupName.pause();
        }


        customConsumerGroupName.on('message', (message) => {
           console.log(message);
        });

        customConsumerGroupName.on('error', (error) => {
            console.log('consumer group error: ', error);

           //HERE I NEED TO CALL SECOND CONSUMER TO STEP UP
           //MAYBE consumerGroup.resume(); ???
        });

    }
}

希望它的声音可以理解,谢谢:)

2 个答案:

答案 0 :(得分:0)

消费群体解决了两种主要情况:

1。缩放 您可以增加一个组中的使用者数量,以处理该组正在使用(向外扩展)的主题中产生的越来越多的消息。

2。故障转移 通过让一组消费者阅读相同的主题,他们将自动处理一个或多个消费者陷入困境的情况。

因此,您不必依靠“待命”的消费群体,而必须处理那些自己活跃的消费群体,而只需依靠Kafka的内置故障转移即可。消费者可以在几个不同的容器中运行(甚至在不同的数据中心中),而Kafka会自动确保将消息传递给各个消费者,无论它们在何处或在给定时间运行了多少。

答案 1 :(得分:0)

因此,似乎由于Node包的“ ConsumerGroup”的名称而引起混乱。用Kafka的术语来说,消费者组仅由每个消费者使用的groupId控制。具有相同groupId的使用者不会收到重复的消息,每个主题消息只能由一个使用者读取。如果某个使用者崩溃,kafka会检测到这一情况,并将其分区分配给一个单独的使用者。

Node'ConsumerGroup'实际上只是Kafka的另一个消费者(新的消费者,具有由Kafka管理的组,而不是从Kafka> 0.9开始的zookeeper)。

因此,将kafka消费者组与Node ConsumerGroup结合使用的方法如下:

function createConsumerGroup(topics){

const ConsumerGroup = kafka.ConsumerGroup;

//CREATE CONSUMER GROUPS FOR EVERY SERVICE
for(let i = 0; i < config.kafka_service.length ;i++){  //3

    const options = {
        groupId: 'SOME_GROUP_NAME',
        host: config.kafka_service[i]['zookeeperHost'],
        kafkaHost: config.kafka_service[i]['kafkaHost'],
        sessionTimeout: 15000,
        protocol: ['roundrobin'],
        fromOffset: 'latest'
    }

    //assign all services CG names and create [i] consumer groups!
    let customConsumerGroupName = config.kafka_service[i]['consumerGroupName'];

    customConsumerGroupName = new ConsumerGroup(options, topics);

    customConsumerGroupName.on('connect', (resp) => {
        console.log(`${config.kafka_service[i]['consumerGroupName']} is connected!`);
    });

    customConsumerGroupName.on('message', (message) => {
       console.log(message);
    });

    customConsumerGroupName.on('error', (error) => {
        console.log('consumer group error: ', error);

       //Error handling logic here, restart the consumer that failed perhaps? 
       //Depends on how you want to managed failed consumers.
    });
  }
}

Nodes ConsumerGroup的每个实例将成为“ SOME_GROUP_NAME”组的成员,并且使用相同groupId创建的任何其他消费者也将充当同一kafka消费者组的成员,而与服务器等无关。