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

Dynamically connecting a Kafka input stream to multiple output 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 框架内有没有更好的方法来做到这一点?

如果您想根据您的数据动态创建主题,您目前在 Kafka 的 Streaming API(v0.10.2 及更早版本)中得不到任何支持。您将需要创建一个 KafkaProducer 并自行实现动态 "routing"(例如使用 KStream#foreach()KStream#process())。请注意,您需要进行同步写入以避免数据丢失(不幸的是,这不是很高效)。有计划使用动态主题路由扩展 Streaming API,但目前还没有此功能的具体时间表。

您还应该考虑另一件事。如果您事先不知道您的目标主题而只是依赖 so-called "topic auto creation" 功能,您应该确保这些主题是使用所需的配置设置创建的(例如,数字分区或复制因子)。

作为 "topic auto creation" 的替代方法,您还可以使用管理客户端(自 v0.10.1 起可用)来创建具有正确配置的主题。参见 https://cwiki.apache.org/confluence/display/KAFKA/KIP-4+-+Command+line+and+centralized+administrative+operations