在 Apache Flink 中,“精确一次(Exactly-Once)”通常指的是端到端的精确一次语义(End-to-End Exactly-Once),即:
数据从 Source 到 Flink 计算,再到 Sink,要么被成功处理一次,要么完全没处理,不会出现重复或丢失。
下面从 核心机制 → 关键组件 → 使用条件 系统说明。
Flink 通过 Barrier 对齐机制 实现一致性快照:
✅ 保证:故障恢复时,状态回滚到最近一次一致快照
Flink 将状态保存在:
状态是 Exactly-Once 的基础。
用于 Sink 端精确一次:
常见支持 Exactly-Once 的 Source:
❌ 不支持:
通过:
execution.checkpointing.mode: EXACTLY_ONCE
| Sink 类型 | 保证方式 |
|---|---|
| Kafka | 两阶段提交(FlinkKafkaProducer) |
| 文件系统 | 原子重命名 |
| 数据库 | 幂等写入 / 事务 |
env.enableCheckpointing(5000);
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
KafkaSink<String> sink = KafkaSink.<String>builder()
.setBootstrapServers("localhost:9092")
.setRecordSerializer(...)
.setDeliveryGuarantee(DeliveryGuarantee.EXACTLY_ONCE)
.build();
❌ 认为 Flink 默认就是 Exactly-Once
✅ 必须显式开启 Checkpoint
❌ Sink 不支持事务但期望 Exactly-Once
✅ 至少要保证 幂等写入
❌ Barrier 不对齐(AT_LEAST_ONCE)
✅ 降低延迟但牺牲语义
Flink 通过 Checkpoint + 状态快照 + 两阶段提交,在保证 Source 可重放、Sink 支持事务或幂等的前提下,实现端到端精确一次。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。