9

我正在尝试为流式分析设计流式架构。要求:

  • RT 和 NRT 流数据输入
  • 实现一些财务分析的流处理器
  • RT 和 NRT 分析输出流
  • 流处理时引用数据请求

我正在探索用于流处理和 RT/NRT 实时消息传递的 Kafka 和 Kafka Streams。我的问题是:我需要在流处理期间对外部系统(信息提供者、MongoDB 等)执行一些查询。根据外部系统特征,这些查询可以是同步和异步请求响应。

我读过这篇文章,解释如何在处理过程中加入 KStream 和 KTable,这很有趣,但在这种情况下,KTable 不依赖于来自 KStream 的输入参数,它只是表的流表示。

我需要为每个 KStream 消息查询外部系统,将一些消息字段作为查询参数传递,并用查询结果丰富流式消息,然后将丰富的消息发布到输出主题。是否有任何统一的范式来设计这种流处理?有什么我最好使用的特定技术吗?请记住,查询可以是同步和异步的。

我还想为这些外部系统设计包装器,实现一种分布式 RPC,可从 Kafka 流处理中调用。你能推荐任何技术/框架吗?我正在考虑使用 Akka 演员来分发查询响应者,但我不明白 Akka 是否适合请求-响应范式。

谢谢

4

1 回答 1

16

关于对外部系统的查询模式,您有多种可能性:

  1. 推荐:使用Kafka Connect将您的数据从外部系统导入 Kafka,并将这些主题读取为KTables 以进行KStream-KTable查找连接。
  2. 您可以在 UDF 代码中实现自己的自定义查找连接。根据详细信息,您可以使用KStream方法#mapValues()#map()或较低级别的方法,例如#transform()#process()。因此,您手动打开与外部系统的连接并为您处理的每条记录发出查找查询。
    • 同步查找:如果您对外部系统进行同步调用,则无需考虑其他任何事情(#mapValues()例如,您可以使用它来实现这一点)
    • async lookpus:对于对外部系统的异步调用,正确处理更棘手(您应该非常小心——这不是推荐的模式,因为目前没有库支持)。首先,您需要以可靠的方式记住您发出的所有异步调用(即,您需要附加一个状态并在实际启动之前将您想要发出的每个请求写入该状态)。其次,在每个回调中,您需要以某种方式缓冲结果,并在稍后再次调用发出请求的同一运算符时对其进行处理(不可能在异步回调处理程序中产生下游结果,而只能在 UDF 代码中)。下游发出后,您可以从状态中删除请求。第三,在失败案例后的恢复中,您需要检查未完成请求的状态并再次发出这些请求。另请记住,这种异步处理打破了一些内部 Streams 假设,例如关于记录主题偏移的保证处理顺序。

比较这个关于偏移提交的流中失败处理的问题:How to handle error and don't commit when use Kafka Streams DSL

于 2017-02-06T19:51:48.303 回答