我在NodeJs应用程序中使用kafka-node来通过loadMetadataForTopics选项创建主题。我希望我的应用程序能够动态地了解可用的分区数量,以便它可以在这些分区之间正确地分发消息。
在单个节点Kafka实例中,该方法正在创建主题并返回元数据,如下所示:
"step1_channelOut": {
"0": {
"topic": "step1_channelOut",
"partition": 0,
"leader": 1,
"replicas": [
1
],
"isr": [
1
]
}
},
但是,在三节点群集中,该方法会创建更多条目:
{
"0": {
"topic": "step1_channelOut",
"partition": 0,
"leader": 3,
"replicas": [
3,
2,
1
],
"isr": [
3,
2,
1
]
},
"1": {
"topic": "step1_channelOut",
"partition": 1,
"leader": 1,
"replicas": [
1,
3,
2
],
"isr": [
1,
3,
2
]
},
"2": {
"topic": "step1_channelOut",
"partition": 2,
"leader": 2,
"replicas": [
2,
1,
3
],
"isr": [
2,
1,
3
]
},
"3": {
"topic": "step1_channelOut",
"partition": 3,
"leader": 3,
"replicas": [
3,
1,
2
],
"isr": [
3,
1,
2
]
}
}
在这种情况下它创建了4个分区吗?它看起来像我 - 因为这只是最后一种情况(真正明确设置分区)我真的不关心它做什么,只要它是可预测的。那说我控制得越多越好。
zookeeper中的主题信息与kafka服务器上的主题信息之间有什么关系?是否有更好的方法通过nodejs操纵(创建/配置主题)kafka集群?
为什么四个分区?我能理解三个,或一个,但四个?
答案 0 :(得分:0)
kafka-node
的工作方式,它会根据server.properties
中的全局Kafka配置创建主题。检查以下值:
num.partitions=12
default.replication.factor=1
经纪人数量和分区数量之间没有自动关系。您可以设置100个代理,但只需要1个主题分区,或者您可以使用1,000个分区设置单个代理。他们没有关系。
没有用于创建主题的非Java API - 至少目前还没有。请参阅我之前未回答的问题 here 。
如果您想要更多地控制主题的创建方式,但仍希望使用kafka-node
进行操作,那么您将需要exec
这样的命令:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 12 --topic <topic_name_here>
我在node
中使用:
const exec = require('child_process').exec;
function createTopic(topic, replFactor, numPartitions, cb) {
var zkHost = "localhost:2181";
var kafkaHome = "/usr/local/kafka";
exec(
`${kafkaHome}/bin/kafka-topics.sh --create --zookeeper ${zkHost} -- replication-factor ${replFactor} --partitions ${numPartitions} --topic ${topic}`,
(error,stderr,stdout) => cb(topic)
);
}