微服務(wù)的發(fā)展
微服務(wù)倡導(dǎo)將復(fù)雜的單體應(yīng)用拆分為若干個功能簡單揪垄、松耦合的服務(wù)穷吮,這樣可以降低開發(fā)難度、增強擴展性饥努、便于敏捷開發(fā)捡鱼。當前被越來越多的開發(fā)者推崇,很多互聯(lián)網(wǎng)行業(yè)巨頭酷愧、開源社區(qū)等都開始了微服務(wù)的討論和實踐驾诈。Hailo有160個不同服務(wù)構(gòu)成缠诅,NetFlix有大約600個服務(wù)。國內(nèi)方面乍迄,阿里巴巴滴铅、騰訊、360就乓、京東、58同城等很多互聯(lián)網(wǎng)公司都進行了微服務(wù)化實踐拱烁。當前微服務(wù)的開發(fā)框架也非常多生蚁,比較著名的有Dubbo、SpringCloud戏自、thrift 邦投、grpc等。
微服務(wù)落地存在的問題
雖然微服務(wù)現(xiàn)在如火如荼擅笔,但對其實踐其實仍處于探索階段志衣。很多中小型互聯(lián)網(wǎng)公司,鑒于經(jīng)驗猛们、技術(shù)實力等問題念脯,微服務(wù)落地比較困難。如著名架構(gòu)師Chris Richardson所言弯淘,目前存在的主要困難有如下幾方面:
1)單體應(yīng)用拆分為分布式系統(tǒng)后绿店,進程間的通訊機制和故障處理措施變的更加復(fù)雜。
2)系統(tǒng)微服務(wù)化后庐橙,一個看似簡單的功能假勿,內(nèi)部可能需要調(diào)用多個服務(wù)并操作多個數(shù)據(jù)庫實現(xiàn),服務(wù)調(diào)用的分布式事務(wù)問題變的非常突出态鳖。
3)微服務(wù)數(shù)量眾多转培,其測試、部署浆竭、監(jiān)控等都變的更加困難浸须。
隨著RPC框架的成熟,第一個問題已經(jīng)逐漸得到解決兆蕉。例如dubbo可以支持多種通訊協(xié)議羽戒,springcloud可以非常好的支持restful調(diào)用。對于第三個問題虎韵,隨著docker易稠、devops技術(shù)的發(fā)展以及各公有云paas平臺自動化運維工具的推出,微服務(wù)的測試包蓝、部署與運維會變得越來越容易驶社。
而對于第二個問題企量,現(xiàn)在還沒有通用方案很好的解決微服務(wù)產(chǎn)生的事務(wù)問題。分布式事務(wù)已經(jīng)成為微服務(wù)落地最大的阻礙亡电,也是最具挑戰(zhàn)性的一個技術(shù)難題届巩。微服務(wù)架構(gòu)下,分布式事務(wù)的各種解決方案份乒,并重點為大家解讀阿里巴巴提出的分布式事務(wù)解決方案----GTS恕汇。該方案中提到的GTS是全新一代解決微服務(wù)問題的分布式事務(wù)互聯(lián)網(wǎng)中間件。
分布式基本理論
(1)CAP理論
在分布式系統(tǒng)中:
一致性(Consistency):分布式環(huán)境下多個節(jié)點的數(shù)據(jù)是否強一致或辖。在分布式環(huán)境下瘾英,一致性是指數(shù)據(jù)在多個副本之間能否保持一致的特性。在一致性的需求下颂暇,當一個系統(tǒng)在數(shù)據(jù)一致的狀態(tài)下執(zhí)行更新操作后缺谴,應(yīng)該保證系統(tǒng)的數(shù)據(jù)仍然處于一直的狀態(tài)。
對于一個將數(shù)據(jù)副本分布在不同分布式節(jié)點上的系統(tǒng)來說耳鸯,如果對第一個節(jié)點的數(shù)據(jù)進 行了更新操作并且更新成功后湿蛔,卻沒有使得第二個節(jié)點上的數(shù)據(jù)得到相應(yīng)的更新,于是在對第二個節(jié)點的數(shù)據(jù)進行讀取操作時县爬,獲取的依然是老數(shù)據(jù)(或稱為臟數(shù) 據(jù))阳啥,這就是典型的分布式數(shù)據(jù)不一致的情況。在分布式系統(tǒng)中财喳,如果能夠做到針對一個數(shù)據(jù)項的更新操作執(zhí)行成功后苫纤,所有的用戶都可以讀取到其最新的值,那么 這樣的系統(tǒng)就被認為具有強一致性纲缓。
意思是卷拘,寫操作之后的讀操作,必須返回該值祝高。舉例來說栗弟,某條記錄是 v0,用戶向 G1 發(fā)起一個寫操作工闺,將其改為 v1乍赫。
接下來,用戶的讀操作就會得到 v1陆蟆。這就叫一致性雷厂。
問題是,用戶有可能向 G2 發(fā)起讀操作叠殷,由于 G2 的值沒有發(fā)生變化改鲫,因此返回的是 v0。G1 和 G2 讀操作的結(jié)果不一致,這就不滿足一致性了像棘。
為了讓 G2 也能變?yōu)?v1稽亏,就要在 G1 寫操作的時候,讓 G1 向 G2 發(fā)送一條消息缕题,要求 G2 也改成 v1截歉。
這樣的話,用戶向 G2 發(fā)起讀操作烟零,也能得到 v1瘪松。
分布式一致性的提出
在分布式系統(tǒng)中要解決的一個重要問題就是數(shù)據(jù)的復(fù)制。在我們的日常開發(fā)經(jīng)驗中锨阿,相 信很多開發(fā)人員都遇到過這樣的問題:假設(shè)客戶端C1將系統(tǒng)中的一個值K由V1更新為V2凉逛,但客戶端C2無法立即讀取到K的最新值,需要在一段時間之后才能 讀取到群井。這很正常,因為數(shù)據(jù)庫復(fù)制之間存在延時书斜。
分布式系統(tǒng)對于數(shù)據(jù)的復(fù)制需求一般都來自于以下兩個原因:
1,為了增加系統(tǒng)的可用性酵使,以防止單點故障引起的系統(tǒng)不可用
2荐吉,提高系統(tǒng)的整體性能,通過負載均衡技術(shù)口渔,能夠讓分布在不同地方的數(shù)據(jù)副本都能夠為用戶提供服務(wù)
數(shù)據(jù)復(fù)制在可用性和性能方面給分布式系統(tǒng)帶來的巨大好處是不言而喻的样屠,然而數(shù)據(jù)復(fù)制所帶來的一致性挑戰(zhàn),也是每一個系統(tǒng)研發(fā)人員不得不面對的缺脉。
所謂分布一致性問題痪欲,是指在分布式環(huán)境中引入數(shù)據(jù)復(fù)制機制之后,不同數(shù)據(jù)節(jié)點之間 可能出現(xiàn)的攻礼,并無法依靠計算機應(yīng)用程序自身解決的數(shù)據(jù)不一致的情況业踢。簡單講,數(shù)據(jù)一致性就是指在對一個副本數(shù)據(jù)進行更新的時候礁扮,必須確保也能夠更新其他的 副本知举,否則不同副本之間的數(shù)據(jù)將不一致。
那么如何解決這個問題太伊?一種思路是"既然是由于延時動作引起的問題雇锡,那我可以將寫入的動作阻塞,直到數(shù)據(jù)復(fù)制完成后僚焦,才完成寫入動作"锰提。 沒錯,這似乎能解決問題,而且有一些系統(tǒng)的架構(gòu)也確實直接使用了這個思路欲账。但這個思路在解決一致性問題的同時屡江,又帶來了新的問題:寫入的性能。如果你的應(yīng) 用場景有非常多的寫請求赛不,那么使用這個思路之后惩嘉,后續(xù)的寫請求都將會阻塞在前一個請求的寫操作上,導(dǎo)致系統(tǒng)整體性能急劇下降踢故。
總得來說文黎,我們無法找到一種能夠滿足分布式系統(tǒng)所有系統(tǒng)屬性的分布式一致性解決方案。因此殿较,如何既保證數(shù)據(jù)的一致性耸峭,同時又不影響系統(tǒng)運行的性能,是每一個分布式系統(tǒng)都需要重點考慮和權(quán)衡的淋纲。于是劳闹,一致性級別由此誕生:
數(shù)據(jù)的一致性模型可以分成以下 3 類:
強一致性:數(shù)據(jù)更新成功后,任意時刻所有副本中的數(shù)據(jù)都是一致的洽瞬,一般采用同步的方式實現(xiàn)本涕。
弱一致性:數(shù)據(jù)更新成功后,系統(tǒng)不承諾立即可以讀到最新寫入的值伙窃,也不承諾具體多久之后可以讀到菩颖。
最終一致性:弱一致性的一種形式,數(shù)據(jù)更新成功后为障,系統(tǒng)不承諾立即可以返回最新寫入的值晦闰,但是保證最終會返回上一次更新操作的值。這里之所以將最終一致性單獨提出來鳍怨,是因為它是弱一致性中非常推崇的一種一致性模型呻右,也是業(yè)界在大型分布式系統(tǒng)的數(shù)據(jù)一致性上比較推崇的模型。
可用性(Availability):可用性是指系統(tǒng)提供的服務(wù)必須一直處于可用的狀態(tài)鞋喇,對于用戶的每一個操作請求總是能夠在有限的時間內(nèi)返回結(jié)果窿冯。這里的重點是"有限時間內(nèi)"和"返回結(jié)果"。
"有限時間內(nèi)"是指确徙,對于用戶的一個操作請求醒串,系統(tǒng)必須能夠在指定的時間內(nèi)返回對應(yīng)的處理結(jié)果,如果超過了這個時間范圍鄙皇,那么系統(tǒng)就被認為是不可用的芜赌。另外,"有限的時間內(nèi)"是指系統(tǒng)設(shè)計之初就設(shè)計好的運行指標伴逸,通常不同系統(tǒng)之間有很大的不同缠沈,無論如何,對于用戶請求,系統(tǒng)必須存在一個合理的響應(yīng)時間洲愤,否則用戶便會對系統(tǒng)感到失望颓芭。
"返回結(jié)果"是可用性的另一個非常重要的指標,它要求系統(tǒng)在完成對用戶請求的處理后柬赐,返回一個正常的響應(yīng)結(jié)果亡问。正常的響應(yīng)結(jié)果通常能夠明確地反映出隊請求的處理結(jié)果,即成功或失敗肛宋,而不是一個讓用戶感到困惑的返回結(jié)果州藕。
用戶可以選擇向 G1 或 G2 發(fā)起讀操作。不管是哪臺服務(wù)器酝陈,只要收到請求床玻,就必須告訴用戶,到底是 v0 還是 v1沉帮,否則就不滿足可用性锈死。
分區(qū)容錯性(Partition Tolerance):分區(qū)容錯性約束了一個分布式系統(tǒng)具有如下特性:分布式系統(tǒng)在遇到任何網(wǎng)絡(luò)分區(qū)故障的時候,仍然需要能夠保證對外提供滿足一致性和可用性的服務(wù)穆壕,除非是整個網(wǎng)絡(luò)環(huán)境都發(fā)生了故障待牵。
網(wǎng)絡(luò)分區(qū)是指在分布式系統(tǒng)中,不同的節(jié)點分布在不同的子網(wǎng)絡(luò)(機房或異地網(wǎng)絡(luò)) 中粱檀,由于一些特殊的原因?qū)е逻@些子網(wǎng)絡(luò)出現(xiàn)網(wǎng)絡(luò)不連通的狀況,但各個子網(wǎng)絡(luò)的內(nèi)部網(wǎng)絡(luò)是正常的漫玄,從而導(dǎo)致整個系統(tǒng)的網(wǎng)絡(luò)環(huán)境被切分成了若干個孤立的區(qū)域茄蚯。 需要注意的是,組成一個分布式系統(tǒng)的每個節(jié)點的加入與退出都可以看作是一個特殊的網(wǎng)絡(luò)分區(qū)睦优。
大多數(shù)分布式系統(tǒng)都分布在多個子網(wǎng)絡(luò)渗常。每個子網(wǎng)絡(luò)就叫做一個區(qū)(partition)。分區(qū)容錯的意思是汗盘,區(qū)間通信可能失敗皱碘。比如,一臺服務(wù)器放在中國隐孽,另一臺服務(wù)器放在美國癌椿,這就是兩個區(qū),它們之間可能無法通信菱阵。
上圖中踢俄,G1 和 G2 是兩臺跨區(qū)的服務(wù)器。G1 向 G2 發(fā)送一條消息晴及,G2 可能無法收到都办。系統(tǒng)設(shè)計的時候,必須考慮到這種情況。
一般來說琳钉,分區(qū)容錯無法避免势木,因此可以認為 CAP 的 P 總是成立。CAP 定理告訴我們歌懒,剩下的 C 和 A 無法同時做到啦桌。
3個要素最多只能同時滿足兩個,不可兼得歼培。其中震蒋,分區(qū)容忍性又是不可或缺的。
Consistency 和 Availability 的矛盾
一致性和可用性躲庄,為什么不可能同時成立查剖?答案很簡單,因為可能通信失斣刖健(即出現(xiàn)分區(qū)容錯)笋庄。
如果保證 G2 的一致性,那么 G1 必須在寫操作時倔监,鎖定 G2 的讀操作和寫操作直砂。只有數(shù)據(jù)同步后,才能重新開放讀寫浩习。鎖定期間静暂,G2 不能讀寫,沒有可用性不谱秽。
如果保證 G2 的可用性洽蛀,那么勢必不能鎖定 G2,所以一致性不成立疟赊。
綜上所述郊供,G2 無法同時做到一致性和可用性。系統(tǒng)設(shè)計時只能選擇一個目標近哟。如果追求一致性驮审,那么無法保證所有節(jié)點的可用性;如果追求所有節(jié)點的可用性吉执,那就沒法做到一致性疯淫。
讀者問,在什么場合戳玫,可用性高于一致性峡竣?
舉例來說,發(fā)布一張網(wǎng)頁到 CDN量九,多個服務(wù)器有這張網(wǎng)頁的副本适掰。后來發(fā)現(xiàn)一個錯誤颂碧,需要更新網(wǎng)頁,這時只能每個服務(wù)器都更新一遍类浪。
一般來說载城,網(wǎng)頁的更新不是特別強調(diào)一致性喉磁。短時期內(nèi)锭亏,一些用戶拿到老版本,另一些用戶拿到新版本漱挎,問題不會特別大力细。當然睬澡,所有人最終都會看到新版本。所以眠蚂,這個場合就是可用性高于一致性煞聪。
用一張表格說明一下:?
(2)BASE 理論
BASE理論是對CAP中一致性和可用性權(quán)衡的結(jié)果,其來源于對大規(guī)氖呕郏互聯(lián)網(wǎng)系統(tǒng)分布式實踐的總結(jié)昔脯, 是基于CAP定理逐步演化而來的。BASE理論的核心思想是:即使無法做到強一致性笛臣,但每個應(yīng)用都可以根據(jù)自身業(yè)務(wù)特點云稚,采用適當?shù)姆绞絹硎瓜到y(tǒng)達到最終一致性。接下來看一下BASE中的三要素:
基本可用(BasicallyAvailable):指分布式系統(tǒng)在出現(xiàn)故障時沈堡,允許損失部分的可用性來保證核心可用静陈,注意,這絕不等價于系統(tǒng)不可用诞丽。比如:
? ? ? ? ? ?** 響應(yīng)時間上的損失鲸拥。正常情況下,一個在線搜索引擎需要在0.5秒之內(nèi)返回給用戶相應(yīng)的查詢結(jié)果率拒,但由于出現(xiàn)故障崩泡,查詢結(jié)果的響應(yīng)時間增加了1~2秒
? ? ? ? ? ** 系統(tǒng)功能上的損失:正常情況下禁荒,在一個電子商務(wù)網(wǎng)站上進行購物的時候猬膨,消費者幾乎能夠順利完成每一筆訂單,但是在一些節(jié)日大促購物高峰的時候呛伴,由于消費者的購物行為激增勃痴,為了保護購物系統(tǒng)的穩(wěn)定性,部分消費者可能會被引導(dǎo)到一個降級頁面
軟狀態(tài)(SoftState):指允許分布式系統(tǒng)存在中間狀態(tài)热康,該中間狀態(tài)不會影響到系統(tǒng)的整體可用性沛申,即允許系統(tǒng)在不同節(jié)點的數(shù)據(jù)副本之間進行數(shù)據(jù)同步的過程存在延時。
最終一致性(EventualConsistency):指分布式系統(tǒng)中的所有副本數(shù)據(jù)經(jīng)過一定時間后姐军,最終能夠達到一致的狀態(tài)铁材,因此尖淘,最終一致性的本質(zhì)是需要系統(tǒng)保證最終數(shù)據(jù)能夠達到一致,而不需要實時保證系統(tǒng)數(shù)據(jù)的強一致性著觉。
總的來說村生,BASE理論面向的是大型高可用可擴展的分布式系統(tǒng),和傳統(tǒng)的事物ACID特性是相反的饼丘,它完全不同于ACID的強一致性模型趁桃,而是通過犧牲強一致性來獲得可用性,并允許數(shù)據(jù)在一段時間內(nèi)是不一致的肄鸽,但最終達到一致狀態(tài)卫病。但同時,在實際的分布式場景中典徘,不同業(yè)務(wù)單元和組件對數(shù)據(jù)一致性的要求是不同的蟀苛,因此在具體的分布式系統(tǒng)架構(gòu)設(shè)計過程中,ACID特性和BASE理論往往又會結(jié)合在一起烂斋。