Apache kafka 卡夫卡制作人可以创建主题和分区吗?
目前我正在评估不同的消息传递系统。 有一个关于阿帕奇·卡夫卡的问题,我自己无法回答 卡夫卡制作人是否可以动态地(在现有主题上)创建主题和分区? 如果是的话,它有什么缺点吗 提前感谢更新: 卡夫卡经纪人有一项财产: auto.create.topics.enable 如果将其设置为true,则制作人将消息发布到具有新主题名称的主题,它将自动为您创建主题Apache kafka 卡夫卡制作人可以创建主题和分区吗?,apache-kafka,messaging,kafka-producer-api,Apache Kafka,Messaging,Kafka Producer Api,目前我正在评估不同的消息传递系统。 有一个关于阿帕奇·卡夫卡的问题,我自己无法回答 卡夫卡制作人是否可以动态地(在现有主题上)创建主题和分区? 如果是的话,它有什么缺点吗 提前感谢更新: 卡夫卡经纪人有一项财产: auto.create.topics.enable 如果将其设置为true,则制作人将消息发布到具有新主题名称的主题,它将自动为您创建主题 Confluent团队建议不要这样做,因为主题的爆炸(取决于您的环境)可能会变得笨拙,并且主题创建在创建时始终具有相同的默认值。复制系数至少为3非
Confluent团队建议不要这样做,因为主题的爆炸(取决于您的环境)可能会变得笨拙,并且主题创建在创建时始终具有相同的默认值。复制系数至少为3非常重要,以确保在磁盘出现故障时主题的持久性。启动kafka broker时,可以在
conf/server.properties
文件中定义一组属性。其中一个属性是auto.create.topics.enable
如果将此设置为true(默认情况下),则当您向不存在的主题发送消息时,卡夫卡将自动创建主题。分区号将由同一文件中的默认设置定义
缺点:据我所知,以这种方式创建的主题将始终具有相同的默认设置(分区、副本…)。对于任何消息传递系统,我认为不建议使用生产者动态创建主题/分区或任何队列的方法
对于您的用例,您可能可以使用设备id作为您的as分区键来区分消息。这样您就可以使用一个主题。如果需要,您可以使用java创建一个主题。是否推荐,取决于用例。例如,如果您的主题名称是制作人收到的有效负载的函数,那么它可能会很有用。以下是在kafka 0.10.x中工作的代码片段
void createTopic(String zookeeperConnect, String topicName) throws InterruptedException {
int sessionTimeoutMs = <some-int-value>;
int connectionTimeoutMs = <some-int-value>;
ZkClient zkClient = new ZkClient(zookeeperConnect, sessionTimeoutMs, connectionTimeoutMs, ZKStringSerializer$.MODULE$);
boolean isSecureKafkaCluster = false;
ZkUtils zkUtils = new ZkUtils(zkClient, new ZkConnection(zookeeperConnect), isSecureKafkaCluster);
Properties topicConfig = new Properties();
try {
AdminUtils.createTopic(zkUtils, topicName, 1, 1, topicConfig,
RackAwareMode.Disabled$.MODULE$);
} catch (TopicExistsException ex) {
//log it
}
zkClient.close();
}
void createTopic(字符串zookeeperConnect,字符串topicName)抛出InterruptedException{
int sessionTimeoutMs=;
int connectionTimeoutMs=;
ZkClient ZkClient=新的ZkClient(ZookePerConnect、sessionTimeoutMs、connectionTimeoutMs、ZKStringSerializer$.MODULE$);
布尔值isSecureKafkaCluster=false;
ZkUtils ZkUtils=newzkutils(zkClient,newzkconnection(zookeeperConnect),isSecureKafkaCluster);
Properties topicConfig=新属性();
试一试{
createTopic(zkUtils,topicName,1,1,topicConfig,
RackAwareMode.Disabled$.MODULE$);
}捕获(TopicExistsException){
//记录下来
}
zkClient.close();
}
注意:只允许增加分区数 谢谢,在我的案例中,我希望每个设备(生产者)都有一个主题/分区。我不知道会有多少设备,所以我想动态添加它们。上面的解决方案听起来有点“迟缓”。我认为一个经典的发布/订阅系统可能工作得更好。我考虑过了。问题是,我不知道所有设备/设备ID。或者换句话说,我想添加动态发布数据的设备。我想你不必担心预测密钥(即设备).Kafka默认情况下会随机分配分区。如果您想按设备(即密钥)进行分隔,可以创建一个根据密钥名称进行过滤的流。我们使用类似的方法动态创建主题。分区如何?@user2105282 the
adminitils.createTopic()
方法将分区数和复制数作为参数。因此,您可以相应地选择它们。