apache-kafka - 如何在窗口流式处理中显示中间结果?
问题描述
我们目前在事件存储中进行数据的实时聚合。这个想法是可视化多个时间范围(每月、每周、每天、每小时)和多个名义键的交易数据。我们经常有迟到的数据,所以我们需要考虑到这一点。此外,要求是显示“运行”结果,即当前窗口完成之前的值。
目前我们正在使用 Kafka 和 Apache Storm(特别是 Trident 即微批处理)来执行此操作。我们的架构大致是这样的:
(为我丑陋的照片道歉)。我们使用 MongoDB 作为键值存储来持久化状态,然后通过返回当前查询值的微服务使其可访问(只读)。该设计存在多个问题
- 代码真的是高维护
- 以这种方式很难保证只处理一次
- 每次聚合后更新状态显然会影响性能,但速度足够快。
我们得到的印象是,自从我们开始这个项目以来,使用 Apache Flink 或 Kafka 流更好的框架(尤其是从维护的角度来看——Storm 往往非常冗长)已经可用。尝试这些似乎就像写入数据库一样,尤其是 mongoDB 不再是最先进的。我看到的标准用例是状态在 RocksDB 或内存内部持久化,然后在窗口完成后写回 Kafka。
不幸的是,这使得显示中间结果变得非常困难,并且由于状态在内部保持不变,我们需要允许的事件延迟时间在数月或数年左右。有没有比劫持实时流的状态更好的解决方案?我个人觉得这将是一个标准要求,但找不到一个标准的解决方案。
解决方案
您可以研究Konstantin Knauf 的 Queryable Billing Demo作为如何处理所涉及的一些问题的示例。那里使用的中心相关想法是:
- 在每个事件之后触发窗口,以便它们的结果不断更新
- 使结果可查询(使用 Flink 的可查询状态 API)
这是 Flink Forward 会议演讲的主题。视频可用。
您可以将窗口更新流式传输到仪表板或数据库,而不是使结果可查询。
另外,请注意您可以级联窗口,这意味着每小时窗口的结果可以作为每日窗口的输入等。
推荐阅读
- c++ - 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- ios - Error generating ipa in Swift 5 Xcode 11.2
- python - OSError: [Errno 6] Device not configured
- python - 使用否定前瞻断言提取文件名中的重复部分
- vue.js - Passing data to sub-components in Vue JS. Best practices?
- python - Cross-compiling Python 2.7 for ARM on Ubuntu 18.04 with Missing Modules
- ios - 如何从 ARKit 面部会话深度像素缓冲区创建视频
- mysql - JavaFX MySQL Query 仅显示 customerId 的第一个结果,但 count 显示两个客户
- java - 开始活动未开始
- python - Image matching not working for unknown reason