端到端的Exactly-Once语义 | 青训营笔记

102 阅读2分钟

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

端到端的Exactly Once

上述算法只能保证每条数据被处理一次,但sink算子仍可能重复下发数据

因此要实现端到端的Exactly Once语义,需要特殊的sink算子实现。

两阶段提交协议

事务:一系列要么都完成或都不完成的操作

为处理分布式系统中同时执行或回滚事务性操作,引入中心节点,即协作者coordinator处理所有节点的执行逻辑,被调度的叫做参与者participant

预提交阶段

协作者向所有参与者发送commit消息,参与者执行事务并通过vote yes/no表示事务执行成功、失败

提交阶段

协作者收到的全是vote yes,协调者向所有参与者发送commit消息。参与者释放资源,结束任务。完成后向协调者发送ack消息,协调者收到所有参与者的ack消息后标记任务执行完成。

协作者收到的有vote no,协调者向所有参与者发送rollback消息。参与者进行回滚,完成后向协调者发送ack消息,协调者收到所有参与者的ack消息后标记任务回滚完成。

Flink的2PCsink

开启事务

sink task向下游写入数据前会开启事务,事务提交前sink task写入的数据不可读

预提交

JM作为coordinator,Checkpoint Barrier起到commit消息的作用,各算子按上述算法制作状态快照

提交

与两阶段提交协议相近,回滚后sink task丢弃此次事务提交的数据

案例

一般场景(从kafka读取数据,处理后存入MySQL):不是严格的端到端的Exactly Once;只能在批内去重;可能存在重复写入数据库

Flink账单计费服务

优势:严格意义上的端到端的Exactly Once语义;可在更长的时间维度上对数据进行去重