簡體   English   中英

無法通過多個使用者從具有單個分區的單個主題讀取事件

[英]Not able to read event from single topic that has single partition through multiple consumers

我是使用Kafka-node的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的docker image,下面是我完成的設置

docker run -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,區塊鏈,彭博,cassandra,帽,德魯伊,彈性,彈性5,ftp,hazelcast,hbase,influxdb,jms,kudu,mongodb,mqtt,redis,重新思考,voltdb,雅虎,hdfs,jdbc,elasticsearch,s3,twitter -e CONNECT_HEAP = 6G -e RUNNING_SAMPLEDATA = 0 -e RUNTESTS = 0 landoop / fast-data-dev:latest **

您能否確認在多個消費者方案中的消費者是否屬於同一消費者組?

如果這樣做,則觀察到的行為是正確的。 讓我嘗試詳細說明一下:

  1. 在您描述的場景中,聽起來兩個消費者都屬於同一個消費者組。 在這種情況下,組中的每個使用者只能從一個分區中使用。 由於這里只有一個分區,因此排隊的第一個使用者將使用該分區。

  2. 如果我們有多個消費者組,則每個組中有多個消費者訂閱同一主題(有一個分區)。 在這種情況下,多個使用者可以從同一分區進行消費。

我不熟悉您使用的編程語言,但找不到在您的Kafka使用者中設置“ group.id ”屬性的語句。 您可以嘗試在用戶代碼/配置中設置此設置嗎?

另外,您可以檢查並確認您正在使用的Kafka的版本,以及Kafka中的consumer.properties文件中是否有默認值? 因為從版本0.9.0.0起,group.id屬性值已被強制設置,並且不提供該值將引發錯誤(請檢查此票證 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM