我有一个关于管理多个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(); ???
});
}
}
希望它的声音可以理解,谢谢:)
答案 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消费者组的成员,而与服务器等无关。