Exactly Once语义|青训营笔记

158 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第5天

本次笔记重点内容

    1. 端到端 Exactly-Once 实现
    1. Flink 案例讲解

端到端 Exactly-Once实现

Application Consistency Guarantees 作业一致性保证

  • At-most-once:每条数据消费至多一次
  • At-least-once:每条数据消费至少一次
  • Exactly-once: 每条数据都被消费且仅被消费一次

Two-phase commit protocol 两阶段提交协议

分布式协议,有多个节点参与执行,每个节点都能同时执行或回滚某个事务性操作,也就是有原则的一系列操作,这操作要么全部执行要么不执行,为了保证这个过程,有一个中心节点来统一处理所有节点的执行逻辑,即协作者(coordinator),被其调度的其他业务节点叫参与者(participator)

1.预提交阶段

协作者向参与者发送commit信息,协作者收到后,执行事务但是不真正提交,执行是成功或者失败都会发消息(vote yes/no)

2.提交阶段

  • ①协助者收到全部vote yes消息就会向参与者发送commit信息,表示可以真正执行,完成之后参与者会发送一个ack消息给协作者,协作者收到所有参与者的ack消息之后,表示该事务执行完毕。
  • ②协作者收到了至少一个vote no消息,向参与者发送一个rollback消息,每个参与者回滚事务的执行操作,释放事务所占资源,任何参与者发送一个ack消息给协作者,协作者收到所有参与者的ack消息之后,表示该事务成功回到最初状态。
协作者就是JobManager,参与者就是所有处理逻辑(包括sink)

在Sink的时候会执行两阶段提交,各个Operator执行barrier的checkpoint,成功则进行预提交,如果有任何一个预提交失败则回滚最近的checkpoint。 image.png

Flink案例

账单计算服务

  • ①非严格意义上的端到端Exactly Once语义image.png Kafka: 消息中间件

从kafka中读取固定大小数据,进行去重和聚合计算,处理完成后写入Mysql中,若全部写入成功,则记录当前读取到的消息的终止位置,若失败,则不记录位点,然后在记录的位点之后,继续从kafka中读取固定大小数据... 去重能力有限,只能在当前处理的一批数据内去重,无法在批与批之间去重

  • ②严格意义上的端到端Exactly Once语义image.png 这样下游读到的数据是不丢不重的,可以在更长的时间维度对数据进行去重(但也不是说在任意时间维度,kafka保存数据有限)

总结

端到端的Exactly-Once语义,指的是 Flink 应用从 Source 端开始到 Sink 端结束,数据必须经过起始点和结束点。Flink 自身是无法保证外部系统Exactly-Once语义的,所以 Flink 若要实现所谓端到端的Exactly-Once的要求,外部系统必须支持Exactly-Once语义;然后借助 Flink 提供的分布式快照两阶段提交才能实现。