这是我参与「第四届青训营 」笔记创作活动的第3天
第三节:Exactly Once 语义在 Flink 中的实现
一、数据流和动态表
动态表是指随着时间不断变化的表,但是在任意时刻都可以像是静态表一样查询他
数据流和动态表的转换关系
二、Exactly-Once 和 Checkpoint
一致性保证语义
- At-most-once:每条数据消费至多一次,处理延迟低
- At-least-once:每条数据消费至少一次,一条数据可能存在重复消费
- Exactly-once:每条数据都被消费且仅被消费一次,仿佛故障从未发生
Checkpoint
Checkpoint是指在Flink执行任务的过程中,在不中断任务的前提下,定时保存任务的所有状态数据,并且在任务执行过程中发生异常时,将状态恢复到任意保存点的机制
checkpoint 基于 Chandy-lamport 算法,实现了分布式一致性快照
大致分为以下过程
- Checkpoint barrier 的下发
- 算子状态制作和 barrier 传递
- 多个上游的等待 barrier 对齐现象
- Checkpoint 并不阻塞算子数据处
- Checkpoint ACK和制作完成
三、端到端 Exactly-Once 实现
两阶段提交协议(2PC)
- Coordinator:协作者,同步和协调所有节点处理逻辑的中心节点
- Participant:参与者,被中心节点调度的其他执行处理逻辑的业务节点
两阶段提交协议在Flink中的应用
- 协作者和参与者角色分配
- 协作者发起阶段一提交
- 各算子Checkpoint的制作
- 提交阶段及Checkpoint的制作完成
预提交阶段: 所有参与者执行事务但是不真的提交,事务执行是否成功反馈给协作者
提交阶段: 若协作者收到所有参与者yes的消息,就让参与者执行事务所需的资源同时结束这次事务的提交,否则所有参与者回滚事务
四、Flink 案例讲解
以账单计算服务为例(端到端Exactly-once场景)
-
传统:kafak->mysql+checkpoint(去重,聚合)->mysql(数据全部写入则记录当前读取到的消息的终止位置,否则不记录位点)
-
存在的问题:不能做到严格意义的端到端Exactly-once语义、去重能力有限
-
Flink解决方案