Kafka Streams内置的功能是否允许将单个输入流动态连接到多个输出流? KStream.branch
允许基于true / false谓词的分支,但这不是我想要的。我希望每个传入的日志确定它将在运行时流式传输到的主题,例如,日志{"date": "2017-01-01"}
将流式传输到主题topic-2017-01-01
并且日志{"date": "2017-01-02"}
将被流式传输到主题topic-2017-01-02
。
我可以在流上调用forEach
,然后写一个Kafka制作人,但这看起来并不优雅。在Streams框架中有更好的方法吗?
答案 0 :(得分:5)
如果您想根据数据动态创建主题,那么目前(v0.10.2
及更早版本)您无法在Kafka的Streaming API中获得任何支持。您需要创建一个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