Kafka制作人可以创建主题和分区吗?

时间:2017-04-22 19:58:56

标签: apache-kafka messaging kafka-producer-api

目前我正在评估不同的消息系统。 有一个与Apache Kafka有关的问题,我无法自己回答。

Kafka制作人是否可以动态创建主题和分区(在现有主题上)? 如果是的话,它有什么不利之处吗?

先谢谢

4 个答案:

答案 0 :(得分:9)

更新:

kafka经纪人有一个属性: auto.create.topics.enable

如果生产者使用新主题名称向主题发布消息,则将其设置为true,它将自动为您创建主题。

Confluent团队建议不要这样做,因为主题的爆炸,取决于您的环境可能会变得难以处理,并且主题创建在创建时将始终具有相同的默认值。复制因子至少为3至关重要,以确保在磁盘发生故障时主题的持久性。

答案 1 :(得分:3)

如果需要,您可以从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();
}

注意:它只允许增加否。分区。

答案 2 :(得分:2)

当您启动kafka代理时,您可以在conf/server.properties文件中定义一组属性。如果将此属性设置为true(默认情况下),则其中一个属性为auto.create.topics.enable,当您向非现有主题发送消息时,kafka将自动创建主题。分区号将由同一​​文件中的默认设置定义。

缺点:据我所知,以这种方式创建的主题将始终具有相同的默认设置(分区,副本......)。

答案 3 :(得分:1)

对于任何邮件系统,我都不认为建议的方式是由制作人动态创建主题/分区或任何队列。

对于您的用例,您可以使用device_id作为分区键来区分消息。这样您就可以使用一个主题。