服務(wù)設(shè)計要解決的問題

????前幾天和同事聊天,同事說:

“業(yè)務(wù)的服務(wù)(相對于我們基礎(chǔ)架構(gòu)這邊的底層技術(shù))在技術(shù)上就需要解決三個問題:分布式、通信和存儲。”

我回憶之前做業(yè)務(wù)的時光,覺得確實,再加上一個“服務(wù)治理”就差不多了。想想“服務(wù)設(shè)計要解決的問題”這個話題可以把之前靜兒寫的很多文章做一個歸納概括。今天做一個總結(jié)。

分布式

通常要解決的問題是分布式事務(wù)的一致性問題。


剛性事務(wù)和柔性事務(wù)

  剛性事務(wù):嚴格遵循ACID原則(原子性、一致性、隔離性、持久性)的事務(wù)。基本上指的是本地數(shù)據(jù)庫事務(wù)。根據(jù)CAP原則,分布式下的事務(wù)都不是剛性事務(wù)。

  柔性事務(wù):遵循CAP理論或者其變種BASE理論的事務(wù)。分布式事務(wù)基本上都是柔性事務(wù)。


  因為剛性事務(wù)基本上等價于本地數(shù)據(jù)庫事務(wù),而柔性事務(wù)基本上等價于分布式事務(wù)。只是一個是按照事務(wù)嚴格性來區(qū)分,一個是按使用場景來區(qū)分。所以平時除了用來做對比,很少直接提剛性事務(wù)和柔性事務(wù)的概念。


分布式事務(wù)理論

  分布式事務(wù):在分布式環(huán)境下,各個操作步驟并不在同一臺機器上,需要保證所有動作都有一個統(tǒng)一的結(jié)果的一組操作。


  CAP原則(記得在之前的博客中多次寫過):分布式環(huán)境下,數(shù)據(jù)一致性、服務(wù)可用性、分區(qū)容錯性三者最多只能滿足其中二者。

    數(shù)據(jù)一致性(consistency):這里的一致性是強一致性,又叫線性一致性。即一個寫操作成功,而讀出的必須是寫操作后的新數(shù)據(jù)。而寫操作失敗讀出的必須是寫操作前的舊數(shù)據(jù)。

    服務(wù)可用性(availability):所有的操作在一定時間內(nèi)都能得到響應(yīng)。

    分區(qū)容錯性(partition-tolerance):在網(wǎng)絡(luò)分區(qū)環(huán)境下,被分割的節(jié)點仍然能對外提供服務(wù)。

選 ? ?擇說 ? ?明

AP分隔的節(jié)點同時對外服務(wù)但不能相互通信,將導(dǎo)致狀態(tài)不一致,即不能滿足C

CP網(wǎng)絡(luò)分區(qū)的情況下為達成C,請求只能一直等待,即不滿足A

CA在一定時間內(nèi)要達到節(jié)點狀態(tài)一致,要求不能出現(xiàn)網(wǎng)絡(luò)分區(qū),則不能滿足P


  BASE理論:這是基于CAP理論權(quán)衡之后的結(jié)果。核心思想是即使無法做到強一致性,但可以使用一些技術(shù)手段達到最終一致。BASE是Basically Available(基本可用)、Soft state(軟狀態(tài))、Eventually consistent(最終一致性)的縮寫。

分布式事務(wù)一致性實現(xiàn)方案

  為了解決分布式一致性問題,前人在性能和數(shù)據(jù)一致性的權(quán)衡過程中總結(jié)了許多經(jīng)典的協(xié)議和算法。比較著名的有:2PC、3PC、TCC、Paxos、Raft、Zab、ISR。除了這些之外,業(yè)界用的最多的其實是基于MQ實現(xiàn)的。


  2PC(Two Phase Commit)兩階段提交:一般說的兩階段提交是基于XA協(xié)議的。另外JTA協(xié)議的也比較常見。

  XA是一個分布式事務(wù)協(xié)議。它大致分為兩部分:事務(wù)管理器和本地資源管理器。其中本地資源管理器往往由數(shù)據(jù)庫實現(xiàn),比如Oracle、DB2都實現(xiàn)了XA接口。MySQL對XA的支持不是很好。而事務(wù)管理器作為全局的調(diào)度者,負責(zé)各個本地資源的提交和回滾。

兩階段提交的優(yōu)點是:原理簡單、實現(xiàn)方便。缺點是同步阻塞、單點問題、數(shù)據(jù)不一致。


  3PC(Three Phrase Commit)三階段提交:分為CanCommit、PreCommit、Do Commit 三個階段。就是把兩階段提交的Phase 1分成兩個,預(yù)提交的時候如果有參與者返回No或者超時則中斷事務(wù)。

  三階段提交的優(yōu)點是降低參與者阻塞范圍,并能夠在出現(xiàn)單點故障后繼續(xù)達成一致。缺點是因為preCommit階段,在這個階段如果出現(xiàn)網(wǎng)絡(luò)分區(qū),協(xié)調(diào)者無法與參與者正常通信,參與者仍然會進行實物提交,造成數(shù)據(jù)不一致。


  TCC(Try-Confirm-Cancel)

    Try:完成所有的檢查,預(yù)留必須資源

    Confirm:使用Try階段預(yù)留的資源執(zhí)行業(yè)務(wù),如果執(zhí)行出現(xiàn)異常,要重試

    Cancel:釋放Try階段預(yù)留資源

    TCC能夠?qū)Ψ植际绞聞?wù)中的各個資源進行分別鎖定,分別提交與釋放。適用于嚴格一致、執(zhí)行時間短、實時性要求高的場景。


  Paxos算法:之前看過《從Paxos到Zookeeper》那本書,沒怎么看明白。實現(xiàn)比較復(fù)雜,Zookeeper就是用這個來實現(xiàn)的分布式一致性。Paxos算法、Raft協(xié)議和Zab(Zookeeper Atomic Broadcast)協(xié)議都是一種通過多數(shù)投票來保證主備數(shù)據(jù)一致性的。

  ISR(In-Sync Replicas)機制:Kafka使用了這個機制來保證數(shù)據(jù)一致性。ISR認為對于2f+1個副本來說,多數(shù)投票機制要求最多只能允許f個副本發(fā)生故障,如果要支持2個副本的容錯,則需要至少維持5個副本。

通信……

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容