【问题标题】:kafka-node ready event is not getting triggeredkafka-node 就绪事件没有被触发
【发布时间】:2020-04-27 12:30:07
【问题描述】:

我正在使用 kafka-node npm 模块,0.2.27 版本。
我发现 producer.on('ready',fn(){}) 永远不会被调用。
当我检查生产者对象时,观察到如下

{ ready: true,
  client: 
   { connectionString: '10.196.160.100.:2181,10.196.160.150:2181,10.196.160.151:2181',
     clientId: 'dev',
     zkOptions: { sessionTimeOut: 10000, spinDelay: 1000, retries: 10 },
     brokers: 
      { 'custom-kafka.mine.com:9092': [Object],
        'custom-storm.mine.com:9092': [Object] },
     longpollingBrokers: {},
     topicMetadata: {},
     topicPartitions: {},
     correlationId: 0,
     cbqueue: {},
     brokerMetadata: { '0': [Object], '1': [Object] },
     ready: true,
     zk: { client: [Object], _events: [Object], inited: true },
     _events: { ready: [Object], error: [Object], close: [Object] } },
  requireAcks: 1,
  ackTimeoutMs: 100,
  _events: {} }

我没有等待 on ('ready') 事件,而是检查了if(producer.ready),我能够在稍有超时的情况下发布到 kafka。
理想情况下,应该触发事件。
我不是确定我是否采用了正确的方法。
非常感谢任何指向这个方向的指针。
提前致谢

【问题讨论】:

    标签: node.js apache-kafka


    【解决方案1】:

    试试下面的代码:

    var kafka = require('kafka-node'),
        Producer = kafka.Producer,
        client = new kafka.Client('192.168.50.252:2181'),
        producer = new Producer(client),
        payloads = [
            { 
                topic: 'test topic', 
                messages: ['test message'] 
            }
        ];
    
        client.on('ready', function (){
            console.log('client ready');
        })  
    
        client.on('error', function (err){
            console.log('client error: ' + err);
        })  
    
        producer.on('ready', function () {
            producer.send(payloads, function (err, data) {
                console.log('send: ' + data);        
                process.exit();
            });
        });
    
        producer.on('error', function (err) {
            console.log('error: ' + err);
            process.exit();
        });
    

    【讨论】:

    • 嗨乔恩,我有一个类似的代码。但是,问题是“就绪”事件没有被触发。我发现 zookeeper 和 kafka 已经启动并运行了
    • 您可以尝试添加一些额外的代码来检查客户端是否连接正常 - 我在上面的示例中添加了一些代码 - 这将确认客户端连接到 Zookeeper 正常
    • 就绪事件只会被触发一次。有可能它正在触发,但你错过了它。
    【解决方案2】:

    我也遇到过这个问题,我相信你的方法是正确的。 当生产者的构造函数被调用时,生产者的就绪事件只被触发一次。在 producer.ready 属性设置为 true 之后。 因为我相信像我一样,你也在其他地方调用构造函数并从那里返回或导出生产者,这意味着准备事件不会在你实际调用 producer.send() 的地方触发

    相反,使用

    `if(producer.ready){
        producer.send(payloads, function(err,res){
                console.log(res)
        });
     }        
    `
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多