文章

Flink 三种异步IO

在 Flink 中,异步 I/O 主要用于提高外部数据查询(如数据库、缓存、REST API 等)的吞吐量。Flink 提供了三种不同的异步模式:

  1. 有序(Ordered Mode)
  2. ProcessingTime 无序(Unordered Mode)
  3. EventTime 无序(EventTime Unordered Mode)

这些模式主要影响 异步请求的返回顺序 和 如何影响流处理的时间语义。


1. 有序模式(Ordered Mode)

在 有序模式 下,Flink 确保所有异步请求 按照输入数据的顺序 依次输出,即:

  • 输入数据顺序 = 异步请求返回顺序 = 最终输出顺序
  • 后续数据需要等待前面的数据完成异步请求后再处理

执行流程

  1. 输入数据 A -> B -> C
  2. Flink 发起异步请求:
    • A 请求 → B 请求 → C 请求
  3. 请求返回时间:
    • C 先返回(最快)
    • B 第二个返回
    • A 最后返回(最慢)
  4. 由于 有序模式保证顺序,最终输出必须是:
    • A 返回后输出 A
    • B 返回后输出 B
    • C 返回后输出 C
  5. BC 必须等 A 先输出,即便 BC 早已返回。

优缺点

✅ 优点:

  • 数据顺序不会改变,适用于对顺序要求严格的场景,如:
    • 需要保证时间序列数据的顺序
    • 需要保持日志、交易记录等业务数据的顺序

❌ 缺点:

  • 性能较低,因为 所有请求的返回必须按照输入顺序排列,如果一个请求很慢(如 A ),后续请求(BC)就会被阻塞,导致整体吞吐量降低。

适用场景

  • 订单处理系统:如果数据流的顺序很重要,比如订单数据流,必须按顺序处理(订单创建 -> 支付 -> 发货 -> 评价)。
  • 交易系统日志:金融交易、日志数据等必须按顺序输出。

2. ProcessingTime 无序模式(Unordered Mode)

在 ProcessingTime 无序模式 下:

  • 输入数据顺序 ≠ 异步请求返回顺序 ≠ 最终输出顺序
  • 请求完成后立即输出结果
  • 不会保证数据顺序

执行流程

  1. 输入数据 A -> B -> C
  2. Flink 发起异步请求:
    • A 请求 → B 请求 → C 请求
  3. 请求返回时间:
    • C 先返回(最快)
    • B 第二个返回
    • A 最后返回(最慢)
  4. 由于 无序模式不会等待前面的请求,最终输出:
    • C 先返回,立即输出 C
    • B 第二个返回,立即输出 B
    • A 最后返回,最后输出 A
  5. 输出顺序可能与输入顺序不同

优缺点

✅ 优点:

  • 吞吐量高,不会因慢请求阻塞整个流水线,提高并发能力。
  • 适合 外部请求响应时间不确定 的场景,比如 API 调用、数据库查询。

❌ 缺点:

  • 无法保证顺序,如果下游系统依赖数据顺序,可能需要手动排序。

适用场景

  • 推荐系统:比如用户行为数据流,每条数据查询用户画像,不需要严格顺序。
  • 社交媒体分析:每条社交媒体消息做情感分析,分析结果可以乱序。
  • 实时指标计算:比如计算不同地区的销售额,每个地区的请求耗时不同,但最终汇总结果时顺序无关紧要。

3. EventTime 无序模式(EventTime Unordered Mode)

在 EventTime 无序模式 下:

  • 输入数据顺序 ≠ 异步请求返回顺序
  • 最终输出顺序会根据 EventTime 进行恢复
  • 异步请求完成后不立即输出,而是等待水位线(Watermark)推进,保证 EventTime 顺序

执行流程

  1. 输入数据 A (EventTime=10s) -> B (EventTime=20s) -> C (EventTime=30s)
  2. Flink 发起异步请求:
    • A 请求 → B 请求 → C 请求
  3. 请求返回时间:
    • C 先返回(最快)
    • A 第二个返回
    • B 最后返回(最慢)
  4. Watermark 机制保证 EventTime 先后顺序
    • Watermark = 10s,A 可以输出
    • Watermark = 20s,B 可以输出
    • Watermark = 30s,C 可以输出

优缺点

✅ 优点:

  • 结合 EventTime + Watermark,能够保证最终数据的时间顺序。
  • 适用于 数据乱序但需要按照 EventTime 处理的流。

❌ 缺点:

  • 需要 水位线 正确推进,否则可能导致数据等待过久。
  • 如果数据乱序严重,可能需要 较大的延迟 以等待数据到齐。

适用场景

  • 日志分析:不同服务器上报的日志可能乱序,但最终分析时需要按时间排序。
  • 实时 BI 报表:如果订单数据乱序到达,最终统计销售额时要按照时间顺序计算。

三种模式对比总结

模式 顺序保证 吞吐量 适用场景
Ordered(有序模式) ✅ 保证输入顺序 🚫 低(慢请求会阻塞) 日志分析、交易数据、订单处理
ProcessingTime Unordered(无序模式) 🚫 无法保证顺序 ✅ 高(最快返回立即输出) 推荐系统、情感分析、监控数据
EventTime Unordered(基于 EventTime 的无序模式) ✅ 最终按 EventTime 顺序输出 ⚠️ 需要等待水位线,吞吐量中等 服务器日志分析、实时 BI 报表

结论

查询请求耗时不稳定,并且 对顺序要求不高,建议 ProcessingTime 无序模式,可以最大化吞吐量。

数据有时间语义(比如日志、交易数据),并且 希望保持时间顺序,建议 EventTime 无序模式,但需要配置好 Watermark。

数据必须严格保持原始顺序,比如订单状态流,建议 有序模式(Ordered Mode),但吞吐量会受限。

License:  CC BY 4.0