At Most once,At Least once和Exactly once

在分布式系统中,组成系统的各个计算机是独立的。这些计算机有可能fail。

一个sender发送一条message到receiver。根据receiver出现fail时sender如何处理fail,可以将message delivery分为三种语义:

At Most once: 对于一条message,receiver最多收到一次(0次或1次).

可以达成At Most Once的策略:

sender把message发送给receiver.无论receiver是否收到message,sender都不再重发message.

At Least once: 对于一条message,receiver最少收到一次(1次及以上).

可以达成At Least Once的策略:

sender把message发送给receiver.当receiver在规定时间内没有回复ACK或回复了error信息,那么sender重发这条message给receiver,直到sender收到receiver的ACK.

Exactly once: 对于一条message,receiver确保只收到一次

Flink的Exactly once模式

Flink实现Exactly once的策略: Flink会持续地对整个系统做snapshot,然后把global state(根据config文件设定)储存到master node或HDFS.当系统出现failure,Flink会停止数据处理,然后把系统恢复到最近的一次checkpoint.

什么是分布式系统的global state?

分布式系统由空间上分立的process和连接这些process的channel组成.

空间上分立的含义是,这些process不共享memory,而是通过在communication channel上进行的message pass来异步交流.

分布式系统的global state就是所有process,channel的local state的集合.

process的local state取决于the state of local memory and the history of its activity.

channel的local state是上游process发送进channel的message集减去下游process从channel接收的message的差集.

什么是一致性global state?

假设有两个银行账户A,B.A中初始有600美元,B中初始有200美元. SA, SB, CAB, CBA由A和B分别记录,组成了global state.

在t0时刻,A向B转账50美元;在t1时刻,B向A转账80美元.

如果SA, SB记录于(t0, t1), CAB, CBA记录于(t1, t2),那么global state = 550+200+50+80 = 880,比真实值多了$80. 这就是不一致性global state.

如果 SA, SB, CAB, CBA同属于一个时间区间,那么得到的global state就是一致性的.

Snapshot算法获得一致性global state的难点是什么?

分布式系统没有共享内存(globally shared memory)和全局时钟(global clock).

如果分布式系统有共享内存,那么可以从共享内存中直接获取整个分布式系统的snapshot,无需分别获得各个process,channel的local state再组合成global state.

如果分布式系统有global clock,那么所有的process能在同一时刻各自记录local state,这样就保证了state的一致性.

获得一致性global state的算法 ---- Chandy-Lamport算法

精髓:该算法在普通message中插入了control message – marker

前提:

1)       message的传输可能有delay,但一定会到达

2)       每两个process之间都有一条communication path(可能由多条channel组成)

3)       Channel是单向的FIFO

描述:

Marker sending rule for process Pi

(1)     Process Pi 记录自身state

(2)     Pi在记录自身state后,发送下一条message前,Pi向自己所有的outgoing channel发送marker

Marker receiving rule for process Pj on receiving a marker along channel C

如果Pj第一次接收到marker,那么

把channel C的state记为空集

执行marker sending rule

否则(并非第一次接收到marker)

把记录自身state(或最近一次记录另一个channel的state)后,收到这个marker前的message集记为C的state

每个process会记录自身的state和它的incoming channel的state

图解:

A,B,C,D代表4个process.有向线段代表FIFO的channel.绿色圆形代表普通message,橙色矩形代表marker.蓝色的节点和线段代表已经记录state的process和channel

Process A启动snapshot算法,A执行marker sending rule(记录自身state,然后发送marker):

Process B接收到marker,执行marker receiving rule:将channel AB的state记为空集,然后记录自身state并向下发送marker:

Process C接收到marker, 执行marker receiving rule:将channel AC的state记为空集,然后记录自身state并向下发送marker:

Process D接收到来自于process B的marker, 执行marker receiving rule:将channel BD的state记为空集,然后记录自身state并向下发送marker:

Process D接收到来自于process C的marker, 执行marker receiving rule:这是process D第二次接收到marker,将channel CD的state记为{5},不会向下发送marker:

自此process A,B,C,D的local state和所有Channel的state都记录完毕. 将这些local state组合,所得到的就是global state

Flink的snapshot算法 ---- Asynchronous Barrier Snapshotting(ABS)

为了消去记录channel state这一步骤,process在接收到第一个barrier后不会马上做snapshot,

而是等待接受其他上游channel的barrier.

在等待期间,process会把barrier已到的channel的record放入input buffer.

当所有上游channel的barrier到齐后,process才记录自身state,之后向所有下游channel发送barrier.

因为先到的barrier会等待后到的barrier,所有所有barrier相当于同时到达process,

因此,该process的上游channel的state都是空集.这就避免了去记录channel的state

图解:

A是JobManager, B C是source,D是普通task.

JobManager发起一次snapshot:向所有source发送barrier.

每个Barrier先后到达各自的source.Source在收到barrier后记录自身state,然后向下游节点发送barrier

Barrier (from)B 到达process D,但不会进行snapshot

Barrier (from)B已经到达process D,

所以当来自于channel BD的record 6 7到达后,process D不会处理它们,而是将它们放入input buffer.

而Barrier (from)C尚未到达process D,所以当来自于channel CD的record 4到达后,process D会处理它.

Barrier C也到达process D.

这样,process D已经接收到了所有上游process的barrier.process D记录自身state,然后向下游节点发送barrier

ABS的at least once模式

当process接收到barrier后,会立刻做snapshot. Process会继续处理所有channel的record.后来的snapshot会覆盖之前的snapshot.

Record 6本不属于这次checkpoint,却包含在process D的local state中.

在recovery时,source认为record 6还没有被处理过,所以重发record 6. 这就导致stream中出现了两个record 6,造成了at least once.

这里的问题在于,当第二个barrier到达时,节点D再次对自身做了snapshot.

而在Chandy-Lamport的算法中,第二个barrier到达时,节点D应该对barrier来源的channel做snapshot.

对单一input channel的算子来说,没有Alignment这个概念.这些算子在at least once模式下也是呈现exactly once的行为.

转载于:https://www.cnblogs.com/tuowang/p/9022198.html

深入理解Flink ---- 系统内部消息传递的exactly once语义相关推荐

  1. [源码分析] 从FlatMap用法到Flink的内部实现

    [源码分析] 从FlatMap用法到Flink的内部实现 0x00 摘要 本文将从FlatMap概念和如何使用开始入手,深入到Flink是如何实现FlatMap.希望能让大家对这个概念有更深入的理解. ...

  2. 深入理解 Flink 容错机制

    本文作者:Paul Lin 本文链接: 2019/07/28/深入理解-Flink-容错机制/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议.转载请注 ...

  3. 一文理解Flink 水位线(Flink Watermark)

    文章目录 Flink 中的时间语义 `处理时间` `事件时间` 水位线(Watermark) `事件时间和窗口` `什么是水位线` 有序流中的水位线 乱序流中的水位线 `水位线的特性` `如何生成水位 ...

  4. 理解Android系统的进程间通信原理(二)----RPC机制

    理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用).有关RMI ...

  5. 理解Android系统的进程间通信原理------RPC机制

    理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用).有关RMI ...

  6. 理解单片机系统—汇编语言

    理解单片机系统 一.理解CPU的三种工作模式 从80386开始,CPU有三种工作方式:实模式(real-mode).保护模式(protected-mode)和虚拟8086模式.只有在刚刚启动的时候是实 ...

  7. Linux学习笔记之——Linux系统内部相关介绍

    Linux学习笔记之--Linux系统内部相关介绍 摘要:主要记录一些比较有用的能够帮助理解和使用Linux的知识.比如一些相关概念.没兴趣的看看就好.知道有这么个东西.注意事项.和一些常用目录的作用 ...

  8. 【软件】windows录音,如何录制系统内部声音(几乎找遍全网的所有方法)

    1. 引言 最近因为一些原因,需要录制一些远程会议的音频,便于回溯记录.因此花了一些时间,去找了一下有什么软件可以录制系统内部的声音. 不单单是麦克风收录的声音,还包括系统内部的声音,就是我们耳机里能 ...

  9. 1.7 深入理解Audio系统

    第7章 深入理解Audio系统 7.1 概述 Audio系统是Android平台的重要组成部分,它主要包括三方面的内容: AudioRcorder和AudioTrack:这两个类属于Audio系统对外 ...

最新文章

  1. 小程序加载本地图片路径问题
  2. 二叉树(前序遍历序列、中序遍历序列、后序遍历序列、层次遍历序列、深度、叶子数)
  3. 第一行代码学习笔记第七章——探究内容提供器
  4. mysql技术分享-- 视图是什么
  5. mfc ctabctrl 双排显示_盐城便宜的开口型双排脚手架生产厂家-斯戴博盘扣脚手架...
  6. 24.Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)
  7. 500 强IT公司武汉诚聘 .Net Specialist (Team Leader)
  8. 【ROS系统】解决找不到用户工作空间下的程序包的问题——E:No such package
  9. sklearn分类、回归器总结
  10. html同页框架间本地信息传递,[MUI] mui框架实现页面间传值
  11. 【转】深度技术分析“为什么ios比android流畅”
  12. ModBus(RTU TCP UDP通信)及利用socket通信(DTU)实现Modbus-RTU通信协议
  13. C语言之:数组的定义和初始化必备练习题
  14. “挂羊头卖狗肉”的宇宙学谭
  15. aws mediatailor运行原理图
  16. android 更改浏览器默认主页
  17. Google gflags使用说明
  18. 打印formdata的值
  19. 快速找出QQ群成员中不在名单内的人
  20. 成功配置华为IPSec

热门文章

  1. 没有配置默认路由_网络路由选择原理
  2. oracle 11g r2 rac中节点时间不同步,Oracle 11gR2 安装RAC错误之--时钟不同步
  3. 最大似然估计_机器学习最大似然估计
  4. opencv python3 找图片不同_基于OpenCV-python3实现抠图
  5. swagger map示例_Android Google Map Street View示例
  6. MapInfo启动时,提示the Microsoft jet engine is not available
  7. 深入理解JAVA中的NIO
  8. kubeadm部署k8s1.9高可用集群--1集群概述
  9. leetcode -- Search Insert Position
  10. [Android Pro] 告别编译运行 ---- Android Studio 2.0 Preview发布Instant Run功能