目前我正在评估不同的消息系统。 有一个与Apache Kafka有关的问题,我无法自己回答。
Kafka制作人是否可以动态创建主题和分区(在现有主题上)? 如果是的话,它有什么不利之处吗?
先谢谢
答案 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作为分区键来区分消息。这样您就可以使用一个主题。