程序员

Flink状态一致性之exactly-once

作者:admin 2021-04-28 我要评论

幂等写入 一个操作重复执行很多次但只导致一次结果的更改也就是说后面重复执行就不起作用了。eg: ?pow(e,x)求多阶导还等于自己HashMap多次写入key相同的键值对等...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

幂等写入:

一个操作重复执行很多次,但只导致一次结果的更改,也就是说后面重复执行就不起作用了。eg: ?pow(e,x)求多阶导还等于自己,HashMap,多次写入key相同的键值对等。

但需要注意的是,也会出现中间状态短暂的不一致,最终结果一致的情景。eg:flink的checkpoint还有流批结合做关联模型转换的ETL,这些不满足强一致性,但可实现最终一致性。

?

事务写入:

构建的事务对应着checkpoint,等到checkpoint真正完成的时候,才把所有对应的结果写入sink系统中,否则可回滚、撤销事务。

1. 预写日志(Write-Ahead-Log,WAL):把结果数据先当状态,提前在状态后端中缓存,然后在收到checkpoint完成的通知后,再一次性地写入到sink系统。

  • 特点:简单易实现、可适用于任何sink系统;但由于最后数据是按批处理写入,会存在延时;且按批写入的时候若没有做事务隔离,过程中发生故障恢复后就会导致重复写入。
  • 实现类:DataStream API提供了一个模板类GenericWriteAheadSink,来实现这种事务性sink。

2.?两阶段提交(Two-Phase-Commit,2PC):对于每个checkpoint,sink会让sink系统启动一个事务,然后将接受到的数据写入外部sink系统,但是不提交,只是"预提交"阶段,当jobmanager通知sink任务全部算子的checkpoint已经整合完成,sink任务才让sink系统正式提交事务,实现结果的真正写入。

  • 特点:真正实现了exactly-once;数据还是流式写入,不存在批处理的延时,且相比WAL额外开销小;但是对sink系统要求较高,需要外部系统支持事务,适应性不是很广泛。
  • 实现类:Flink提供了TwoPhaseCommitSinkFunction接口,实现较为复杂,需配置项比较多。

?

整个上下游状态一致性保证会受限于短板,根据木桶原理,端到端整体的一致性级别取决于最薄弱的那个环节。

?

接下来以kafka-flink-kafka为例,该组合可保证端到端的exactly-once:

注意:此场景下,kafka作为sink端需要开启readCommit的隔离级别。

?

;原文链接:https://blog.csdn.net/LSur_king/article/details/115436298

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 解密阿里云高效病原体基因检测工具

    解密阿里云高效病原体基因检测工具

  • 探秘!在阿里云做产品经理是怎样的体验

    探秘!在阿里云做产品经理是怎样的体验

  • 精彩回顾 | 阿里云 Serverless Develop

    精彩回顾 | 阿里云 Serverless Develop

  • 为什么SOFA RPC调用30s还不超时?

    为什么SOFA RPC调用30s还不超时?

腾讯云代理商
海外云服务器