上一篇讲到Flink是基于有状态的运算,而避免了传统流计算缺少程序状态支持的数据存储,访问,动态扩容,数据库回滚一致性等问题。这一篇主要讲Flink如何通过状态管理而做到流计算中的消息传输保障。
一,一致性与全局状态
在分布式系统中,运行着多个相互关联的服务节点。
一致性是指分布式系统中的多个服务节点,给定一系列的操作,在约定协议的保障下,使它们对外界呈现的状态是一致的。换句话说,也就是保证集群中所有服务节点中的数据完全相同并且能够对某个提案(Proposal)达成一致。
感兴趣的还可以了解一下CAP理论的强一致性和BASE理论的最终一致性。
在一些场景中,我们需要在分布式系统中获取它的全局状态,比如我们需要知道系统中是否达到了如死锁这样的稳定状态(fault tolerance),或者我们需要当前系统的版本信息来做系统优化(system reconfiguration)。这就像是在一群流动的羊中数羊的个数,解决方法就是给羊群拍一张照片,因此我们也把记录分布式系统全局状态的方法叫做快照(snapshot)。
二,流处理运算的三级消息传输语义
回到流计算概念,在流处理系统中,我们对应数据记录的处理,有3种级别的语义定义,以此来衡量这个流处理系统的能力。
At most once(最多一次)。每条数据记录最多被处理一次,含义就是,出现故障时,不保证这条消息原本应该涉及的所有处理节点计算都顺