Kafka Stream的output topic是否必须手动创建?
Kafka Streams输出主题创建问题答复
你编写的Kafka Streams示例代码如下:
KStream<String, String> kstream = builder.stream("input-topic"); kstream.to("output-topic");
输出主题不强制要求手动创建,但生产环境强烈建议提前手动创建。
Kafka集群默认开启auto.create.topics.enable配置,当客户端(包括Kafka Streams应用)访问不存在的主题时,集群会自动按照全局默认配置创建该主题,这就是你运行应用时output-topic和内部主题被自动创建的原因。
官方Javadoc的说明如下:
指定的主题应当在使用前(即Kafka Streams应用启动前)手动创建
该要求是生产环境的最佳实践,而非强制限制,主要原因如下:
- 自动创建的主题默认使用集群全局的默认参数:分区数默认1、副本数默认1,无法匹配流处理的并行度要求、容灾可用性要求。如果你的Kafka Streams应用配置了多线程并行度,自动创建的少分区输出主题会导致并行处理的消息分布不均,完全浪费多线程的性能优势。
- 自动创建的主题没有匹配业务需求的自定义配置,比如消息保留时长、日志清理策略、最大消息大小等参数,可能会导致消息丢失、消息写入失败等问题。
- 绝大多数生产环境的Kafka集群会关闭
auto.create.topics.enable配置,避免随意创建主题造成集群资源浪费、权限混乱,这种场景下不提前手动创建主题会直接导致Kafka Streams应用启动失败。
不同场景的处理建议:
- 本地测试、开发环境:如果集群开启了自动创建配置,可以不用手动创建输出主题,应用可以正常运行。
- 生产环境:必须提前手动创建所有用到的主题,包括输入主题、输出主题、以及Kafka Streams用到的内部重分区主题、状态存储changelog主题,严格按照业务需求配置对应的分区数、副本数、清理策略等参数。
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

