将 Kafka 输入流动态连接到多个输出流

问题描述 投票:0回答:1

Kafka Streams 中是否内置了允许将单个输入流动态连接到多个输出流的功能?

KStream.branch
允许基于真/假谓词进行分支,但这并不是我想要的。我希望每个传入日志确定它将在运行时流式传输到的主题,例如,日志
{"date": "2017-01-01"}
将流式传输到主题
topic-2017-01-01
,日志
{"date": "2017-01-02"}
将流式传输到主题
topic-2017-01-02
.

我可以在流上调用

forEach
,然后写入 Kafka 生产者,但这看起来不太优雅。在 Streams 框架内有更好的方法来做到这一点吗?

java apache-kafka apache-kafka-streams
1个回答
6
投票

更新

从 Kafka 2.0 开始,通过将

TopicNameExtractor
传入
to()
运算符来支持动态路由。 (参见 https://cwiki.apache.org/confluence/display/KAFKA/KIP-303%3A+Add+Dynamic+Routing+in+Streams+Sink

原答案

如果您想根据数据动态创建主题,目前 Kafka 的 Streaming API 中您无法获得任何支持(

v0.10.2
及更早版本)。您需要创建一个
KafkaProducer
并自行实现动态“路由”(例如使用
KStream#foreach()
KStream#process()
)。请注意,您需要进行同步写入以避免数据丢失(不幸的是,这性能不是很好)。有计划通过动态主题路由来扩展 Streaming API,但目前还没有该功能的具体时间表。

您还应该考虑另一件事。如果您提前不知道目标主题并且仅依赖所谓的“主题自动创建”功能,则应确保使用所需的配置设置(例如分区数量)创建这些主题或复制因子)。

作为“主题自动创建”的替代方案,您还可以使用管理客户端(自

v0.10.1
起可用)来创建具有正确配置的主题。请参阅https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations

© www.soinside.com 2019 - 2024. All rights reserved.