Flink 三种异步IO
在 Flink 中,异步 I/O 主要用于提高外部数据查询(如数据库、缓存、REST API 等)的吞吐量。Flink 提供了三种不同的异步模式:
- 有序(Ordered Mode)
- ProcessingTime 无序(Unordered Mode)
- EventTime 无序(EventTime Unordered Mode)
这些模式主要影响 异步请求的返回顺序 和 如何影响流处理的时间语义。
1. 有序模式(Ordered Mode)
在 有序模式 下,Flink 确保所有异步请求 按照输入数据的顺序 依次输出,即:
- 输入数据顺序 = 异步请求返回顺序 = 最终输出顺序
- 后续数据需要等待前面的数据完成异步请求后再处理
执行流程
- 输入数据
A -> B -> C
- Flink 发起异步请求:
A
请求 →B
请求 →C
请求
- 请求返回时间:
C
先返回(最快)B
第二个返回A
最后返回(最慢)
- 由于 有序模式保证顺序,最终输出必须是:
A
返回后输出A
B
返回后输出B
C
返回后输出C
B
和C
必须等A
先输出,即便B
和C
早已返回。
优缺点
✅ 优点:
- 数据顺序不会改变,适用于对顺序要求严格的场景,如:
- 需要保证时间序列数据的顺序
- 需要保持日志、交易记录等业务数据的顺序
❌ 缺点:
- 性能较低,因为 所有请求的返回必须按照输入顺序排列,如果一个请求很慢(如
A
),后续请求(B
、C
)就会被阻塞,导致整体吞吐量降低。
适用场景
- 订单处理系统:如果数据流的顺序很重要,比如订单数据流,必须按顺序处理(
订单创建 -> 支付 -> 发货 -> 评价
)。 - 交易系统日志:金融交易、日志数据等必须按顺序输出。
2. ProcessingTime 无序模式(Unordered Mode)
在 ProcessingTime 无序模式 下:
- 输入数据顺序 ≠ 异步请求返回顺序 ≠ 最终输出顺序
- 请求完成后立即输出结果
- 不会保证数据顺序
执行流程
- 输入数据
A -> B -> C
- Flink 发起异步请求:
A
请求 →B
请求 →C
请求
- 请求返回时间:
C
先返回(最快)B
第二个返回A
最后返回(最慢)
- 由于 无序模式不会等待前面的请求,最终输出:
C
先返回,立即输出C
B
第二个返回,立即输出B
A
最后返回,最后输出A
- 输出顺序可能与输入顺序不同
优缺点
✅ 优点:
- 吞吐量高,不会因慢请求阻塞整个流水线,提高并发能力。
- 适合 外部请求响应时间不确定 的场景,比如 API 调用、数据库查询。
❌ 缺点:
- 无法保证顺序,如果下游系统依赖数据顺序,可能需要手动排序。
适用场景
- 推荐系统:比如用户行为数据流,每条数据查询用户画像,不需要严格顺序。
- 社交媒体分析:每条社交媒体消息做情感分析,分析结果可以乱序。
- 实时指标计算:比如计算不同地区的销售额,每个地区的请求耗时不同,但最终汇总结果时顺序无关紧要。
3. EventTime 无序模式(EventTime Unordered Mode)
在 EventTime 无序模式 下:
- 输入数据顺序 ≠ 异步请求返回顺序
- 最终输出顺序会根据 EventTime 进行恢复
- 异步请求完成后不立即输出,而是等待水位线(Watermark)推进,保证 EventTime 顺序
执行流程
- 输入数据
A (EventTime=10s) -> B (EventTime=20s) -> C (EventTime=30s)
- Flink 发起异步请求:
A
请求 →B
请求 →C
请求
- 请求返回时间:
C
先返回(最快)A
第二个返回B
最后返回(最慢)
- Watermark 机制保证 EventTime 先后顺序
- Watermark = 10s,
A
可以输出 - Watermark = 20s,
B
可以输出 - Watermark = 30s,
C
可以输出
- Watermark = 10s,
优缺点
✅ 优点:
- 结合 EventTime + Watermark,能够保证最终数据的时间顺序。
- 适用于 数据乱序但需要按照 EventTime 处理的流。
❌ 缺点:
- 需要 水位线 正确推进,否则可能导致数据等待过久。
- 如果数据乱序严重,可能需要 较大的延迟 以等待数据到齐。
适用场景
- 日志分析:不同服务器上报的日志可能乱序,但最终分析时需要按时间排序。
- 实时 BI 报表:如果订单数据乱序到达,最终统计销售额时要按照时间顺序计算。
三种模式对比总结
模式 | 顺序保证 | 吞吐量 | 适用场景 |
---|---|---|---|
Ordered(有序模式) | ✅ 保证输入顺序 | 🚫 低(慢请求会阻塞) | 日志分析、交易数据、订单处理 |
ProcessingTime Unordered(无序模式) | 🚫 无法保证顺序 | ✅ 高(最快返回立即输出) | 推荐系统、情感分析、监控数据 |
EventTime Unordered(基于 EventTime 的无序模式) | ✅ 最终按 EventTime 顺序输出 | ⚠️ 需要等待水位线,吞吐量中等 | 服务器日志分析、实时 BI 报表 |
结论
查询请求耗时不稳定,并且 对顺序要求不高,建议 ProcessingTime 无序模式,可以最大化吞吐量。
数据有时间语义(比如日志、交易数据),并且 希望保持时间顺序,建议 EventTime 无序模式,但需要配置好 Watermark。
数据必须严格保持原始顺序,比如订单状态流,建议 有序模式(Ordered Mode),但吞吐量会受限。
License:
CC BY 4.0