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

时间:2017-01-22 21:11:54

标签: java apache-kafka apache-kafka-streams

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框架中有更好的方法吗?

1 个答案:

答案 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