Kafka Stream处理过程中的外部系统查询

时间:2017-02-06 09:34:47

标签: apache-kafka apache-kafka-streams

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

  • RT和NRT流数据输入
  • 流处理器实施一些财务分析
  • RT和NRT分析输出流
  • 流处理期间的参考数据请求

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

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

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

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

由于

1 个答案:

答案 0 :(得分:11)

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

  1. 建议使用:使用Kafka Connect将数据从外部系统导入Kafka,并将这些主题读作KTable以执行KStream-KTable查找联接。
  2. 您可以在UDF代码中实现自己的自定义查找联接。根据详细信息,您可以使用KStream方法#mapValues()#map()或更低级别的方法,例如#transform()#process()。因此,您手动打开与外部系统的连接,并为您处理的每个记录发出查询查询。
    • 同步查找:如果您同步调用外部系统,则无需考虑其他任何内容(例如,可以使用#mapValues()来实现此目的)
    • async lookpus :对于外部系统的异步调用,要做到正确起来比较棘手(你应该非常小心 - 它不是推荐的模式,因为目前没有图书馆支持)。 首先 ,您需要记住以可靠方式发出的所有异步调用(即,您需要附加状态并将要发出的每个请求写入状态< em>在之前你实际启动了它)。 第二,在每个回调中,您需要以某种方式缓冲结果,并在稍后再次调用发出请求的同一运算符时处理它(它不可能产生下游结果异步回调处理程序,但仅限于UDF代码中)。下游发出后,您可以从状态中删除请求。 第三 ,在失败案例后的恢复中,您需要检查您的状态是否有未完成的请求并再次发出这些请求。还要记住,这种异步处理会打破一些内部Streams假设,例如关于记录主题偏移的保证处理顺序。
  3. 比较有关偏移提交的流中故障处理的问题:How to handle error and don't commit when use Kafka Streams DSL