2017-01-22 68 views
8

Kafka Streams中是否具有允许将单个输入流动态连接成多个输出流的功能? KStream.branch允许基于真/假谓词进行分支,但这不是我想要的。我希望每个传入日志确定它将在运行时流式传输的主题,例如,日志{"date": "2017-01-01"}将流式传输到主题topic-2017-01-01,而日志{"date": "2017-01-02"}将传输到主题topic-2017-01-02将Kafka输入流动态连接到多个输出流

我可以在流上调用forEach,然后给卡夫卡制作人写信,但看起来不太优雅。在Streams框架中有更好的方法吗?

+0

你是什么意思“基于一个字符串” - btw:'KStream.branch'有多个谓词(你的问题表明你错过了这个)。所以'branch'应该允许你做你想做的事。也许你可以给一个数据的例子? –

+2

我应该更清楚。我意识到它需要多个谓词 - 如果我有一个固定数量的话题要传播,那将是一个很好的解决方案。不过,我要做的是写入名为'foo- {date}'的主题。 – kellanburket

回答

4

如果您想根据您的数据动态创建主题,那么您目前在卡夫卡的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

+0

您可以给我们一个链接到动态主题路由计划 - 我想遵循进度 - 谢谢 – AutomatedMike

+0

https://issues.apache.org/jira/browse/KAFKA-4936 –