使用 Amazon Managed Service for Apache Flink 进行实时流处理 - 有状态处理与窗口聚合

在 Apache Flink 全托管环境中通过 SQL 或 Java/Python 应用执行实时流处理。解析窗口聚合、模式检测及 Kinesis/MSK 集成的设计模式。

Managed Flink 概述

Managed Service for Apache Flink 是以托管方式运行 Apache Flink 应用的流处理服务。作为 Kinesis Data Analytics 的后继产品,可以无服务器方式使用 Flink 的全部功能。与 Lambda 的事件级处理不同,Flink 提供有状态的流处理 (聚合、连接、模式检测)。

窗口聚合与检查点

滚动窗口以固定时间区间 (例如每 1 分钟) 聚合数据,用于实时指标计算。滑动窗口以重叠的时间区间计算移动平均值。会话窗口根据事件间的间隔划分会话,适用于用户会话分析。检查点定期将 Flink 的状态持久化到 S3,在故障时从检查点精确恢复。通过 Exactly-Once 语义防止数据重复或丢失。

Source 与 Sink 的设计

Managed Flink 支持 Kinesis Data Streams、MSK (Managed Streaming for Apache Kafka)、S3 作为 Source。Kinesis 连接器自动管理分片的并行读取和检查点,提供 Exactly-Once 语义。Sink 可指定 Kinesis Data Streams、Firehose、S3、DynamoDB、OpenSearch,将处理结果实时分发到下游。Apache Flink SQL 可将流处理编写为 SQL 查询,无需 Java/Scala 编码即可实现窗口聚合和 Join。Flink 的 Async I/O 可异步调用外部服务 (如 DynamoDB 查询),在保持吞吐量的同时执行数据增强。 关于流处理的实践经验,也可参考Amazon 的相关书籍

Managed Flink 的费用

Managed Flink 按 KPU (Kinesis Processing Unit) 小时计费。1 KPU 相当于 1 vCPU 和 4 GB 内存,每小时约 0.11 美元。需适当设置应用的并行度 (parallelism) 和 KPU 数量,避免过度分配资源。启用自动扩展后,KPU 数量会根据输入数据量自动调整。持久化应用存储 (检查点和状态) 每 GB 月费约 0.10 美元。状态大小增长会导致检查点时间和存储成本增加,因此应设置 TTL 自动删除不需要的状态。

总结

Managed Flink 是以托管方式提供有状态流处理的服务。通过滚动窗口和滑动窗口执行实时数据聚合,通过检查点保证 Exactly-Once 语义。可使用 Flink SQL 以声明式方式编写流处理,通过自动扩展实现根据输入数据量自动调整 KPU 数量。