我必须在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个代理。
答案 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(); }
}
谢谢。