我是Kafka的新手,使用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图像,以下是我已经完成的设置
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,blockchain,彭博,卡桑德拉,COAP,德鲁伊,弹性,elastic5,FTP,hazelcast,HBase的,influxdb,JMS,捻,MongoDB的,MQTT,Redis的,重新思考,voltdb,雅虎,HDFS,JDBC,elasticsearch,S3,叽叽喳喳-e CONNECT_HEAP = 6G -e RUNNING_SAMPLEDATA = 0 -e RUNTESTS = 0 landoop / fast-data-dev:latest **
答案 0 :(得分:1)
您能否确认多个消费者场景中的消费者是否属于同一个消费者群体?
如果他们这样做,那么观察到的行为是正确的。让我试着详细说明一下:
在您所描述的场景中,听起来消费者属于同一个消费者群体。在这种情况下,组中的每个使用者只能使用一个分区。由于我们这里只有一个分区,因此第一个消费者会消耗它。
如果我们有多个使用者群组,则每个群组中有多个使用者订阅同一主题(使用一个分区)。在这种情况下,多个消费者可以使用同一个分区。
我不熟悉您使用的编程语言,但我找不到在Kafka使用者中设置“group.id
”属性的语句。你可以尝试在消费者代码/配置中设置吗?
另外,您是否可以检查并确认您正在使用的Kafka版本以及Kafka中的consumer.properties
文件中是否有默认值?因为从版本0.9.0.0开始,group.id属性值已成为必需值,并且不提供此值应该抛出错误(请检查此ticket)。