架构:一致性

 

摘录:

沈询:一致性这是个说复杂,挺复杂;说简单,也挺简单的领域。要理解一致性,其实关键在一个“看”字,一致性约束的是一个用户写入并提交数据之后,其他用户去读这条记录的时候,要么看到的是事务开始之前的状态,要么就是事务结束后的状态,而在这两个状态之间的事务状态则不会被其他人看到。

我们以一个例子做说明:

李雷要给韩梅梅100元,那么,要么结果是韩梅梅有100元,要么是李雷有100元,而李雷减少了100元,但韩梅梅还没加上这100块的这个中间状态则不能够被其他人看到。

做到这个一致性的一般性做法就是把数据加锁,让某个数据只能被某个进程或线程访问就行了。但这样也有个代价就是锁住数据的时间越长,系统的并发程度越低,系统的tps也就越低了。尤其在分布式场景下,维持锁的延迟在加入了网络这个因素后,变得非常巨大,以至于很难接受。

因此在互联网行业中,大家普遍使用的方式是“最终一致”,也就是,三种状态都有可能出现,但李雷减少了100元,韩梅梅却没加上100元这个状态,因为速度非常快,只有毫秒级,并且对用户没有太多的不良影响,所以就认为是允许了。

用户可见的状态,从原来的两个状态,变成了三个状态。

然而需要注意的是,最终一致并不意味着弱一致,也就是说,韩梅梅“最终”必须能够拿到这笔钱,能够拿到,就是“最终”一致,在异常状态下不能够拿到,那就是“弱”一致。

消息系统的作用,就在于能够将“弱”一致变成“最终”一致,保证多方数据的状态的最终正确性。