Kafka主题创建最佳实践

16
创建Apache Kafka主题的最佳实践是什么?每个人都允许自动创建主题,还是您该如何操作?您是否将主题创建步骤与kafka实例的启动捆绑在一起?
我有一个基于docker的Kafka安装,将被多个应用程序使用。如何将每个应用程序的主题创建与Kafka容器的启动分离?查看Confluent音乐演示,他们通过启动新的kafka镜像,调用“create-topic-script”来创建主题,然后让容器退出。这感觉有点"hacky",但也许这是唯一的方法?
问候
3个回答

17
创建Apache Kafka主题时的最佳实践是什么?每个人都允许自动创建主题吗?这取决于你在做什么。你绝对可以使用主题自动创建,但是自动创建的主题将具有默认的代理全局配置,涉及分区和复制因子。对于Kafka Streams,Confluent工程师建议在启动应用程序之前手动创建主题:我还想指出,不建议为Streams使用自动主题创建,而应在启动Streams应用程序之前手动创建所有输入/输出主题。有关更多详细信息,请参见http://docs.confluent.io/current/streams/developer-guide.html#managing-topics-of-a-kafka-streams-application。关于:你是否将主题创建步骤与kafka-instance的启动捆绑在一起?
是的。如果您有一个Java应用程序,在启动应用程序之前可以在应用程序的main方法中使用AdminClient。如果您有其他类型的应用程序,可以运行调用bin/kafka-topics.sh的init脚本,然后再启动应用程序。如果您使用Kubernetes,可以使用Kubernetes Init Container。但是,您可以采用多种方式来完成此操作。

感觉这有点"hacky",但也许这是唯一的方法?

我认为这不是hacky。我认为拥有init步骤很正常。

最后,请注意,您可能需要配置主题的保留策略。这可以通过基于代理的默认设置或按主题进行设置来完成:https://dev59.com/6Kjka4cB1Zd3GeqPBZtc#48504305

更新

感谢Peter S.指出官方推荐创建主题的方法是在CI流水线中:

推荐的方法是通过持续集成流水线创建主题,其中主题在源代码控制中定义并通过构建过程创建。这样可以确保脚本可以验证所有主题名称是否符合所需的约定,然后再进行创建。一个有用的工具来管理Kafka群集中的主题是kafka-dsf。

非常感谢您提供的出色答案。目前它使用 bin/kafka-topics.sh 运行,也许我只需要适应这个想法。我一定会研究使用 AdminClient 进行脚本编写的方法。 - Jiinxy
1
就像在这里写的一样 https://devshawn.com/blog/apache-kafka-topic-naming-conventions/,我会创建一个CI作业,用于处理创建/更新/验证主题。 - Peter S.
这非常有道理!“推荐的方法是通过持续集成流水线创建主题,其中主题在源代码控制中定义并通过构建过程创建。这可以确保脚本可以验证所有主题名称是否符合所需的约定,然后再进行创建。”谢谢! - Dmitry Minkovsky

2
您有两种方式创建Kafka主题,每种方式取决于您的需求:
  • 将属性auto.create.topics.enable设置为true(默认情况下应该是这样),然后当值发布到代理时,主题将被创建。然后请确保检查以下属性:default.replication.factor用于创建主题的默认副本数,以及num.partitions用于默认分区数量。
  • 使用提供的Kafka实用程序手动创建主题。

这是官方手动创建主题的方法:

bin/kafka-topics.sh --create --zookeeper <your_zookeeper_host>:2181 --replication-factor <number_of_replicas> --partitions <number_of_partitions> --topic <name_of_your_topic>

是的,这些也是我识别出来的选项。问题主要是要选择哪一个。但正如你所说,这可能取决于需求。@Dimitry还指出了使用AdminClient的可能性,我会进一步研究。 - Jiinxy

2
另一种管理主题的选择是采用声明性的 git-ops 方法。这完全将主题管理与应用程序运行时分离。我认为,这是否构成“最佳实践”取决于情况。对于某些使用案例/团队,这可能非常有效。请参见以下问题/答案,了解支持此方法的工具。 如何声明性地管理 Kafka 主题?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接