Exactly Once语义在Flink中的实现|青训营笔记

69 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第3天,在第三节课中主要了解到了Exactly Once语义在Flink中的实现.

一、数据流和动态表

随处可见的流式数据

传统SQL和流处理

image.png

数据流和动态表转换

image.png

  • 动态表:与表示批处理数据的静态表不同,动态表是随时间变化的。可以像查询静态批处理表一样查询它们。数据库表时INSERT、UPDATE和DELETE DML语句的stream的结果,通常称为changelog stream。

连续查询

连续查询:

  • 查询从不终止
  • 查询结果会不断更新,产生一个新的动态表

查询产生仅追加数据的动态表

两个连续查询对比

image.png

Retract消息的产生

image.png

数据流和动态表转换回顾

image.png

  • 数据流和动态表之间的转换
  • 在数据流的查询不会终止
  • 查询可能会有状态,用来不断更新查询的结果

不同数据处理保证的语义

  • At-most-once:出现故障的时候,啥也不做
  • At-least-once:保证每条数据均至少被处理一次
  • Exactly-once:最严格的处理语义

二、Exactly-Once 和Checkpoint

状态快照与恢复

制作快照的时间点

Chandy-Lamport算法

image.png

三、端到端Exactly-Once实现

端到端Exactly-once语义

两阶段提交协议

预提交阶段:

  • 协作者向所有参与者发送一个commit消息
  • 每个参与的协作者收到消息后,执行事务,但是不真正提交
  • 若事务成功执行完成,发送一个成功的消息;执行失败,则发送一个失败的消息 提交阶段:
  • 协作者向所有参与者发送一个commit消息
  • 每个收到commit消息的参与者释放执行事务所需的资源,并结束这次事务的执行
  • 完成步骤2后,参与者发送一个ack消息给协作者
  • 协作者收到所有参与者的ack消息后,标识该事物执行完成

四、Flink案例讲解

账单计算服务

五、总结

  • 数据流可以转换成动态表,动态表也能重新转换成数据流
  • 处理无限数据流的算子可以是有状态的
  • Flink通过Checkpoint机制实现故障前后的状态快照制作和恢复
  • 支持两阶段提交协议的下游存储可以结合Flink Checkpoint机制实现严格意义上端到端的Exactly-Once语义实现