如何在ConsumerGroup中而不是Kafka-Host IP地址中设置Zookeeper IP地址?

时间:2019-05-31 08:13:00

标签: apache-kafka apache-zookeeper kafka-consumer-api kafka-producer-api

我必须在ConsumerGroup中设置Zookeeper IP地址,而不是Kafka-Host IP地址。因为我将复制因子设置为3,所以创建了3个代理。因此,如果一台主机发生故障,则另一台可以接管。

当我尝试将Zookeeper IP地址而不是Kafka-Host IP地址放入ConsumerGroup时,它没有收到从Producer API发送的任何消息。

var kafka = require('kafka-node')
var ConsumerGroup = kafka.ConsumerGroup

function createConsumerGroup () {
  var options = {
    kafkaHost: '127.0.0.1:9092',
    batch: undefined,
    ssl: true,
    groupId: 'demoExample',
    protocol: ['roundrobin'],
    encoding: 'utf8',
    fromOffset: 'latest',
    commitOffsetsOnFirstJoin: true,
    outOfRangeOffset: 'earliest',
    onRebalance: (isAlreadyMember, callback) => { callback(); }
  }

  var consumerGroup = new ConsumerGroup(Object.assign({ id: 'demo-' + process.pid }, options), 'example')

  consumerGroup.on('message', function (message) {
    message.value = JSON.parse(message.value)
    console.log('Message Received')
  })
}

我想要的是,如果我在ConsumerGroup中传递了Zookeeper IP地址,而不是Kafka-Host IP地址,它应该接收从Producer API发送的“ example”主题上的消息。而且,如果一个代理失败,那么它应该从另一个代理接收消息。由于复制因子设置为3,因此创建了3个代理。

2 个答案:

答案 0 :(得分:0)

Kafka 0.9中引入的新消费者API不需要与Zookeeper连接。组平衡现在由Kafka本身处理。因此,您必须提供Kafka主机,而不是Zookeeper主机。

blog post from Confluent应该更加清晰:

  

在Apache Kafka的0.8.2版本发布时,   重新设计了生产者客户,我们已经承诺要重新设计消费者   客户也是如此。我们信守承诺:0.9版引入了   对新设计的消费者客户端的beta支持。高   级别,新消费者的主要区别在于它删除了   “高级”基于ZooKeeper的消费者与   “低级” SimpleConsumer API,而是提供了一个统一的   消费者API。

     

此新使用者是使用功能强大的新服务器端实现的   使团队管理成为Kafka一流的一部分的设施   协议。这具有几个优点。首先,它允许很多   更具可扩展性的组设施,使消费者客户可以   更简单,更薄,可以更快地容纳更大的人群   重新平衡。所有客户均可使用该功能;工作是   在C客户端librdkafka中已经可以使用它了。这个   事实证明,同样的功能对于管理分布式   在卡夫卡生产和消费数据;这是卡夫卡的基础   连接以及几个即将进行的项目。最后完成一个   过去几年中完成的一系列项目,以使卡夫卡完全脱钩   Zookeeper中的客户,从而完全删除了消费者客户的   对ZooKeeper的依赖。 Zookeeper仍然被Kafka使用,但是   代理的实现细节-使用此新功能的客户端   设施根本不需要连接到Zookeeper。这有一个   客户现在一直在工作的运营收益   通过经纪人提供的安全和配额机制。这个   大大简化了消费者并为   消费者API的一流非Java实现出现   随着时间的流逝。

答案 1 :(得分:0)

好的,问题出在ConsumerGroup选项对象上。

我们必须在options对象的“主机”键而不是“ kafkaHost”键中传递Zookeeper IP地址。这样可以解决问题并接收Producer API发送的所有数据。如果一个副本集发生故障,甚至可以自动切换到另一副本集。

var options = {
    kafkaHost: '127.0.0.1:9092',
    batch: undefined,
    ssl: true,
    groupId: 'demoExample',
    protocol: ['roundrobin'],
    encoding: 'utf8',
    fromOffset: 'latest',
    commitOffsetsOnFirstJoin: true,
    outOfRangeOffset: 'earliest',
    onRebalance: (isAlreadyMember, callback) => { callback(); }
  }

以下代码块对其进行了修复。

var options = {
    host: '127.0.0.1:2181', // change in key & value
    batch: undefined,
    ssl: true,
    groupId: 'demoExample',
    protocol: ['roundrobin'],
    encoding: 'utf8',
    fromOffset: 'latest',
    commitOffsetsOnFirstJoin: true,
    outOfRangeOffset: 'earliest',
    onRebalance: (isAlreadyMember, callback) => { callback(); }
  }

谢谢。