区块链系统,首先是一个分布式系统。传统单节点结构演变到分布式系统,碰到的首要问题就是一致性的保障。很显然,如果分布式集群无法保证处理结果一致的话,那任何建立于其上的业务系统都无法正常工作。
一致性
一致性问题是分布式领域最为基础也是最重要的问题。如果分布式系统能实现“一致”,对外就可以呈现为一个完美的、可扩展的“虚拟节点”,相对物理节点具备更优越性能和稳定性。这也是分布式系统希望能实现的最终目标。
注意 一致性并不代表结果正确与否,而是系统对外呈现的状态一致与否;例如,所有节点都达成失败状态也是一种一致。
在互联网网络和计算机世界容易出现的问题:
1:节点之间的网络通信是不可靠的,包括消息延迟、乱序和内容错误等;
2:节点的处理时间无法保障,结果可能出现错误,甚至节点自身可能发生宕机;
3:同步调用可以简化设计,但会严重降低分布式系统的可扩展性,甚至使其退化为单点系统。
分布式系统达成一致的过程,应该满足:
分布式系统领域很多问题的核心秘诀:把多件事情进行排序,而且这个顺序还得是大家都认可的。
强一致性(strong consistency)主要包括下面两类:
顺序一致性(sequential consistency):是一种比较强的约束,保证所有进程看到的全局执行顺序(total order)一致,并且每个进程看自身的执行顺序(local order)跟实际发生顺序一致。
A-->B-->C 不可逆而且是规定的
线性一致性(linearizability consistency):
在顺序一致性前提下加强了进程间的操作排序,形成唯一的全局顺序(系统等价于是顺序执行,所有进程看到的所有操作的序列顺序都一致,并且跟实际发生顺序一致),是很强的原子性保证。(依赖于全局的时钟或锁,要么通过一些复杂算法实现,性能往往不高。)
一定约束下实现所谓最终一致性(eventual consistency),即总会存在一个时刻(而不是立刻),让系统达到一致的状态。大部分Web系统实现的都是最终一致性。相对强一致性,这一类在某些方面弱化化的一致性都笼统称为弱一致性(weak consistency)。