首页 > 解决方案 > 如何在窗口流式处理中显示中间结果?

问题描述

我们目前在事件存储中进行数据的实时聚合。这个想法是可视化多个时间范围(每月、每周、每天、每小时)和多个名义键的交易数据。我们经常有迟到的数据,所以我们需要考虑到这一点。此外,要求是显示“运行”结果,即当前窗口完成之前的值。

目前我们正在使用 Kafka 和 Apache Storm(特别是 Trident 即微批处理)来执行此操作。我们的架构大致是这样的:

在此处输入图像描述

(为我丑陋的照片道歉)。我们使用 MongoDB 作为键值存储来持久化状态,然后通过返回当前查询值的微服务使其可访问(只读)。该设计存在多个问题

  1. 代码真的是高维护
  2. 以这种方式很难保证只处理一次
  3. 每次聚合后更新状态显然会影响性能,但速度足够快。

我们得到的印象是,自从我们开始这个项目以来,使用 Apache Flink 或 Kafka 流更好的框架(尤其是从维护的角度来看——Storm 往往非常冗长)已经可用。尝试这些似乎就像写入数据库一样,尤其是 mongoDB 不再是最先进的。我看到的标准用例是状态在 RocksDB 或内存内部持久化,然后在窗口完成后写回 Kafka。

不幸的是,这使得显示中间结果变得非常困难,并且由于状态在内部保持不变,我们需要允许的事件延迟时间在数月或数年左右。有没有比劫持实时流的状态更好的解决方案?我个人觉得这将是一个标准要求,但找不到一个标准的解决方案。

标签: apache-kafkastreamapache-flinkapache-kafka-streams

解决方案


您可以研究Konstantin Knauf 的 Queryable Billing Demo作为如何处理所涉及的一些问题的示例。那里使用的中心相关想法是:

  1. 在每个事件之后触发窗口,以便它们的结果不断更新
  2. 使结果可查询(使用 Flink 的可查询状态 API

这是 Flink Forward 会议演讲的主题。视频可用。

您可以将窗口更新流式传输到仪表板或数据库,而不是使结果可查询。

另外,请注意您可以级联窗口,这意味着每小时窗口的结果可以作为每日窗口的输入等。


推荐阅读