Kafka Streams是否适合触发记录的批处理?

Are Kafka Streams Appropriate for Triggering Batch Processing of Records?

上下文

我有三个服务,每个服务都会生成特定的 JSON 负载(并且需要不同的时间来完成)处理一条消息,该消息是将所有三个 JSON 有效载荷组合成一个有效载荷的结果。这个最终的有效载荷将被发送到另一个 Kafka 主题,以便它可以被另一个服务使用。

您可以在下面找到一张图表,它可以更好地解释手头的问题。信息聚合器服务收到聚合信息的请求,它将该请求发送到 Kafka 主题,以便服务 1、服务 2 和服务 3 使用该请求并将它们的数据(JSON 有效负载)发送到 3 个不同的 Kafka 主题。

信息聚合器必须使用来自三个服务的消息(这些消息在非常不同的时间发送到它们各自的 Kafka 主题,例如服务 1 需要半小时才能响应,而服务 2 和 3 需要不到 10 分钟)所以它可以生成最终有效负载(表示为 聚合信息 )以发送到另一个 Kafka 主题。

研究

在对 Kafka 和 Kafka Streams 进行了大量研究之后,我遇到了 this article,它提供了一些关于如何详细阐述的重要见解。

在这篇文章中,作者消费来自单个主题的消息,而在我的特定用例中,我必须消费来自三个不同主题的消息,等待来自每个主题的具有特定 ID 的每条消息到达,以便我可以发出信号我的过程是它可以继续使用不同主题中具有相同 ID 的 3 条消息以生成最终消息并将该最终消息发送到另一个 Kafka 主题(然后另一个服务将使用该消息)。

深思熟虑的解决方案

我的想法是,我需要让 Kafka Stream 检查所有三个主题,当它看到所有 3 条消息都可用时,向名为 e.g. 的 kafka 主题发送一条消息。信息聚合器将从中消费并通过消费消息的 TopicEvents 将确切知道从哪个主题、分区和偏移量获取哪些消息,然后可以继续将最终有效负载发送到另一个 Kafka 主题。

问题

抱歉这么长post,您能提供的任何指示都会非常有帮助,在此先感谢您

How can I signal a Stream that all of the messages have arrived

您可以使用流和连接来完成此操作。由于连接仅限于 2 个主题,因此您需要进行 2 次连接才能获得所有 3 个主题都已发生的事件。

加入TopicA和TopicB得到A和B发生时的事件。将 AB 与 TopicC 连接以获得 A、B 和 C 发生的事件。