Kafka Stream处理期间的外部系统查询

A. *_*ani 6 apache-kafka apache-kafka-streams

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

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

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

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

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

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

谢谢

Mat*_*Sax 11

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

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

比较关于偏移提交的关于流中的故障处理的问题:如何处理错误并且在使用Kafka Streams DSL时不提交