这是我参与「第四届青训营」笔记创作的第3天
Exacly Once 语义在Flink中的实现
- 数据流和动态表
- 流式数据是随处可见的
- 传统的SQL和流处理
- 动态表:随时间变化
- 数据库表:Insert, Update, Delete DML语句的stream结果 -连续查询:查询不终止&查询结果不断更新,产生新的动态表
- 不同数据处理保证语义
-
- at-most once:出现故障的时候啥也不做,数据处理不保证任何语义,处理时延低
- at least once:保证每条数据均至少被处理一次,一条数据可能存在重复消费
- exactly once:最严格的语义处理,从输出结果来看,每条数据均被消费一次且仅消费一次
- Exactly—Once和Checkpoint
- source:读数据流
- 状态恢复时间点:需要等待所有的处理逻辑消费完成,source保留状态及之前的数据
- 简单的快照制作算法:暂停处理输入的数据➡️等待后续所有处理算子消费当前已经输入的数据➡️所有算子复制自己的状态并保存到远端可靠存储➡️回复对输入数据的处理
- Chandy-Lamport 算法:
3. 端到端Exactly-Once 实现
- Checkpoint 能保证每条数据都对各个有状态的算子更新一次,sink输出算子仍然可能下发重复的数据
- exactly-once语义需要特殊的sink算子实现
- 两阶段提交协议:coordinator+participant
- 事务开启
- 预提交阶段
- 提交阶段
- Flink案例讲解
- 账单计算服务