Невозможно прочитать событие из одной темы, которая имеет один раздел для нескольких потребителей - PullRequest
0 голосов
/ 27 мая 2018

Я новичок в Kafka, использую Kafka-узел.Я использую Kafka для обработки данных в реальном времени.Система имеет одного производителя и несколько потребителей.Я могу получать данные, если один из потребителей работает одновременно, но если я запускаю двух потребителей, только один из них получит данные, а другой не получит никаких данных.

Код дляПроизводитель kafka:

const config = require('../config');
const logger = require('./logger');
const kafka = require('kafka-node'),
HighLevelProducer = kafka.HighLevelProducer,
client = new kafka.Client(`${config.kafka.host}:${config.kafka.port}`),
producer = new HighLevelProducer(client);

producer.on('ready', () => {
logger.info("Events producer to kafka is ready...");
});

producer.on('error', (err) => {
logger.error("Error while starting kafka producer:" + err.message);
});

const queueEvent = (event, callback) => {
const payloads = [
{ topic: config.kafka.queueName, messages: JSON.stringify(event, null, 
2) },
];
producer.send(payloads, (err, data) => {
if (err) {
logger.error(`Error while producing data: ${err.message}`);
callback(err);
} else {
callback(null, data);
}
});
};

module.exports = {
queueEvent
};

Конфигурация для всех потребителей такая же, как показано ниже:

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

const logger = require('../common/logger');
const config = require('../common/config');
const eventDao = require('../models/event');
const _ = require('lodash');

const { getDeviceHierarchy } = require('../common/apiUtils');

const options = { autoCommit: true, fetchMaxWaitMs: 1000, fetchMaxBytes: 
1024 * 1024 };

const HighLevelConsumer = kafka.HighLevelConsumer,
client = new kafka.Client(`${config.kafka.host}:${config.kafka.port}`),
consumer = new HighLevelConsumer(
client,
[
{ topic: config.kafka.queueName, partition: 0 }
],
options
);

Я использую образ док-станции Kafka, и ниже приведены настройки, которые я сделал

запуск докера -d -p 2181: 2181 -p 3030: 3030 -p 8081-8083: 8081-8083 -p 9581-9585: 9581-9585 -p 9092: 9092 -e ADV_HOST =localhost -e DISABLE = azure-documentdb, blockchain, bloomberg, cassandra, coap, druid, эластичный ,astic5, ftp, hazelcast, hbase, effxdb, jms, kudu, mongodb, mqtt, redis, переосмыслить, voltdb, yahoo, hdfs, jdbc,asticsearch, s3, twitter -e CONNECT_HEAP = 6G -e RUNNING_SAMPLEDATA = 0 -e RUNTESTS = 0 landoop / fast-data-dev: последние **

1 Ответ

0 голосов
/ 28 мая 2018

Не могли бы вы подтвердить, принадлежат ли потребители в сценарии с несколькими потребителями к одной и той же группе потребителей?

Если это так, то наблюдаемое поведение является правильным.Позвольте мне немного подробнее остановиться на этом:

  1. В описанном вами сценарии кажется, что оба потребителя принадлежат к одной и той же группе потребителей.В этом случае каждый потребитель из группы может потреблять только один раздел.Поскольку у нас здесь только один раздел, его использует первый потребитель в строке.

  2. Если у нас несколько групп потребителей, в каждой группе несколько потребителей, подписывающихся на одну и ту же тему (с одним разделом).В этом случае несколько потребителей могут использовать один и тот же раздел.

Я не знаком с языком программирования, который вы использовали, но не смог найти оператор, устанавливающий "group.id "собственность у вашего потребителя КафкиНе могли бы вы попробовать установить это в своем коде / конфигурации пользователя?

Также, вы можете проверить и подтвердить версию Kafka, которую вы используете, и есть ли значение по умолчанию в файле consumer.properties в Kafka?поскольку в версии 0.9.0.0 значение свойства group.id стало обязательным, и его отсутствие должно приводить к ошибке (установите этот флажок ).

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