Событие публикации запускается до того, как продюсер будет готов - PullRequest
0 голосов
/ 05 декабря 2018

Я написал модуль узла для подключения к Kafka.

kafka-connect.js

var kafka = require('kafka-node');

var Producer = kafka.Producer,
    client = new kafka.Client(),
    producer = new Producer(client);

module.exports = {
    producer
};

KafkaService.js

const {producer} = require('./kafka-connect');

producer.on('error', function (err) {
    console.log('Producer is in error state');
    console.log(err);
});
producer.on('ready', function () {
    console.log('Producer is ready');
});

const KafkaService = {
     sendRecord: (kafkaTopic, data, callback = (err, data) => console.log(err)) => {
        var sendingData = {};
        sendingData.event_data = JSON.stringify(data);
        sendingData.event_type = 6;
        const record = [
            {
                topic: kafkaTopic,
                messages: sendingData,
                partition : 0
            }
        ];
        producer.send(record, callback);
     }
};

module.exports = {
    KafkaService
};

Теперь я используюэти двое для публикации данных в Кафке.Ниже приведен код для этого:

const {KafkaService} = require('../kafka/KafkaService');

const {newOrder} = require('../objs/newOrderEvent');

KafkaService.sendRecord("incentive_order_data", newOrder);

Но при запуске этого файла выдается ошибка:

{ BrokerNotAvailableError: Broker not available
    at new BrokerNotAvailableError (/Users/rajat.mishra/self/nodekafka/node_modules/kafka-node/lib/errors/BrokerNotAvailableError.js:11:9)
    at Client.loadMetadataForTopics (/Users/rajat.mishra/self/nodekafka/node_modules/kafka-node/lib/client.js:389:15)
    at Client.send (/Users/rajat.mishra/self/nodekafka/node_modules/kafka-node/lib/client.js:562:10)
    at /Users/rajat.mishra/self/nodekafka/node_modules/kafka-node/lib/client.js:241:10
    at /Users/rajat.mishra/self/nodekafka/node_modules/async/dist/async.js:473:16
    at iteratorCallback (/Users/rajat.mishra/self/nodekafka/node_modules/async/dist/async.js:1064:13)
    at /Users/rajat.mishra/self/nodekafka/node_modules/async/dist/async.js:969:16
    at buildRequest (/Users/rajat.mishra/self/nodekafka/node_modules/kafka-node/lib/client.js:257:24)
    at /Users/rajat.mishra/self/nodekafka/node_modules/async/dist/async.js:3110:16
    at eachOfArrayLike (/Users/rajat.mishra/self/nodekafka/node_modules/async/dist/async.js:1069:9) message: 'Broker not available' }
Producer is ready

Очевидно, метод publish вызывается до того, как производитель будет готов.Я не могу найти решение этой проблемы.Один из способов - представить Обещания на картинке, но это только моя гипотеза, точный метод может быть другим.

1 Ответ

0 голосов
/ 05 декабря 2018

Вы не ждете, когда продюсер будет готов.

Вам нужно будет сделать это

producer.on('ready', function () {
    console.log('Producer is ready');

   // send data here 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...