设计ATM时,强一致性是必然选择,因为算不清楚钱对银行来说是件很丢脸的事情。可实际场景中,对可用性的渴求却超越了一致性,银行的理由很直白:更高的可用性意味着更高的收入。
ATM机有三个基本功能:存钱、取钱和查余额。不管怎么折腾,只有一条清规必须遵守:用户借记卡余额不得小于零。
考虑到存款或查余额都破不了这条戒律,于是可以放弃一致性、照顾更多可用性:随时可以存款,尽管存款后的余额不可能立即传遍全网;随时能查余额,尽管屏幕显示的余额未必最新鲜准确。
只有取款操作会被区别对待。
银行本来可以选择在发生分区时禁止取款,因为无法知道准确余额,但如果执拗于此,会扭伤用户感情,所以权衡之后只能放手。
银行可以做两件事:一是提升内部通信速度,压缩节点间的通信时长;二是设置限额,比如单次取款最高5000。
当取款低于限额时,不必拘泥于严格的一致性,基于当前余额让用户取到钱是一种体贴,即使这个余额并非最新最准。于是用户可以及时取款,银行也能兜住风险。
你一定看出来了,这是放弃用户随时取到借记卡内所有余额的可用性,转身捕捉另一种可用性:能随时取出小额现金,因为后一种可用性在双方看来价值都更高。
内部通信彻底完成的瞬间,分区结束,全网信息终于一致,如果此时发现哪位用户余额小于零,那银行就要开始亡羊补牢了。
可用户通常并非恶意。比如账户余额6000元时,用户父母在老家柜面用存折取出4000,此刻余额应是2000,但此余额信息尚未在分布式网络中传播开,用户当时在外地ATM机上本想取300,结果多按了一个零,如果ATM机依据非最新的余额,会吐出3000块钱,那银行就担着1000元的风险。
银行一般会好意通知用户,如果不还只能认栽,可因为概率低损失小,所以没什么了不起,而且银行也会收点费用,就算存取款都免费,每台ATM机还在扮演广告牌机的角色,7×24小时地为银行高大上的形象加油充电。
总之,ATM能用就好。
另外一个例子是支票。
作者十年前做柜员时,支票只能在开户网点使用,这是银行单方面选择一致性的结果,能彻底避免银行自己吃到空头支票。
后来为提升用户体验,支票在全市任意网点都能用,唯一的代价是支票没有一般业务利索,总会遇到卡顿,这是因为系统想要咬出更多的一致性。
在分布式场景应用最密集的
区块链世界,全网共享一致的最新数据是普通用户的诉求,但普通用户和教官一样,不太可能听说过CAP定理,一时半会无法理解必须折损可用性的事实。
用户不理解不代表问题不存在,于是各路商业精英纷纷出动,对注定丢失的可用性围追堵截,集中体现在对共识算法的设计上。
版权申明:本内容来自于互联网,属第三方汇集推荐平台。本文的版权归原作者所有,文章言论不代表链门户的观点,链门户不承担任何法律责任。如有侵权请联系QQ:3341927519进行反馈。