設計ATM時,強一致性是必然選擇,因為算不清楚錢對銀行來說是件很丟臉的事情。可實際場景中,對可用性的渴求卻超越了一致性,銀行的理由很直白:更高的可用性意味著更高的收入。
ATM機有三個基本功能:存錢、取錢和查余額。不管怎么折騰,只有一條清規必須遵守:用戶借記卡余額不得小于零。
考慮到存款或查余額都破不了這條戒律,于是可以放棄一致性、照顧更多可用性:隨時可以存款,盡管存款后的余額不可能立即傳遍全網;隨時能查余額,盡管屏幕顯示的余額未必最新鮮準確。
只有取款操作會被區別對待。
銀行本來可以選擇在發生分區時禁止取款,因為無法知道準確余額,但如果執拗于此,會扭傷用戶感情,所以權衡之后只能放手。
銀行可以做兩件事:一是提升內部通信速度,壓縮節點間的通信時長;二是設置限額,比如單次取款最高5000。
當取款低于限額時,不必拘泥于嚴格的一致性,基于當前余額讓用戶取到錢是一種體貼,即使這個余額并非最新最準。于是用戶可以及時取款,銀行也能兜住風險。
你一定看出來了,這是放棄用戶隨時取到借記卡內所有余額的可用性,轉身捕捉另一種可用性:能隨時取出小額現金,因為后一種可用性在雙方看來價值都更高。
內部通信徹底完成的瞬間,分區結束,全網信息終于一致,如果此時發現哪位用戶余額小于零,那銀行就要開始亡羊補牢了。
可用戶通常并非惡意。比如賬戶余額6000元時,用戶父母在老家柜面用存折取出4000,此刻余額應是2000,但此余額信息尚未在分布式網絡中傳播開,用戶當時在外地ATM機上本想取300,結果多按了一個零,如果ATM機依據非最新的余額,會吐出3000塊錢,那銀行就擔著1000元的風險。
銀行一般會好意通知用戶,如果不還只能認栽,可因為概率低損失小,所以沒什么了不起,而且銀行也會收點費用,就算存取款都免費,每臺ATM機還在扮演廣告牌機的角色,7×24小時地為銀行高大上的形象加油充電。
總之,ATM能用就好。
另外一個例子是支票。
作者十年前做柜員時,支票只能在開戶網點使用,這是銀行單方面選擇一致性的結果,能徹底避免銀行自己吃到空頭支票。
后來為提升用戶體驗,支票在全市任意網點都能用,唯一的代價是支票沒有一般業務利索,總會遇到卡頓,這是因為系統想要咬出更多的一致性。
在分布式場景應用最密集的
區塊鏈世界,全網共享一致的最新數據是普通用戶的訴求,但普通用戶和教官一樣,不太可能聽說過CAP定理,一時半會無法理解必須折損可用性的事實。
用戶不理解不代表問題不存在,于是各路商業精英紛紛出動,對注定丟失的可用性圍追堵截,集中體現在對共識算法的設計上。
版權申明:本內容來自于互聯網,屬第三方匯集推薦平臺。本文的版權歸原作者所有,文章言論不代表鏈門戶的觀點,鏈門戶不承擔任何法律責任。如有侵權請聯系QQ:3341927519進行反饋。