Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 卡夫卡制作人可以创建主题和分区吗?_Apache Kafka_Messaging_Kafka Producer Api - Fatal编程技术网

Apache kafka 卡夫卡制作人可以创建主题和分区吗?

Apache kafka 卡夫卡制作人可以创建主题和分区吗?,apache-kafka,messaging,kafka-producer-api,Apache Kafka,Messaging,Kafka Producer Api,目前我正在评估不同的消息传递系统。 有一个关于阿帕奇·卡夫卡的问题,我自己无法回答 卡夫卡制作人是否可以动态地(在现有主题上)创建主题和分区? 如果是的话,它有什么缺点吗 提前感谢更新: 卡夫卡经纪人有一项财产: auto.create.topics.enable 如果将其设置为true,则制作人将消息发布到具有新主题名称的主题,它将自动为您创建主题 Confluent团队建议不要这样做,因为主题的爆炸(取决于您的环境)可能会变得笨拙,并且主题创建在创建时始终具有相同的默认值。复制系数至少为3非

目前我正在评估不同的消息传递系统。 有一个关于阿帕奇·卡夫卡的问题,我自己无法回答

卡夫卡制作人是否可以动态地(在现有主题上)创建主题和分区? 如果是的话,它有什么缺点吗

提前感谢

更新:

卡夫卡经纪人有一项财产: auto.create.topics.enable

如果将其设置为true,则制作人将消息发布到具有新主题名称的主题,它将自动为您创建主题


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()
方法将分区数和复制数作为参数。因此,您可以相应地选择它们。