當(dāng)前位置:首頁 > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]隨著互聯(lián)網(wǎng)信息技術(shù)的飛速發(fā)展,數(shù)據(jù)量不斷增大,業(yè)務(wù)邏輯也日趨復(fù)雜,對(duì)系統(tǒng)的高并發(fā)訪問、海量數(shù)據(jù)處理的場(chǎng)景也越來越多。如何用較低成本實(shí)現(xiàn)系統(tǒng)的高可用、易伸縮、可擴(kuò)展等目標(biāo)就顯得越發(fā)重要。為了解決這一系列問題,系統(tǒng)架構(gòu)也在不斷演進(jìn)。傳統(tǒng)的集中式系統(tǒng)已經(jīng)逐漸無法滿足要求,分布式系統(tǒng)被使...

隨著互聯(lián)網(wǎng)信息技術(shù)的飛速發(fā)展,數(shù)據(jù)量不斷增大,業(yè)務(wù)邏輯也日趨復(fù)雜,對(duì)系統(tǒng)的高并發(fā)訪問、海量數(shù)據(jù)處理的場(chǎng)景也越來越多。如何用較低成本實(shí)現(xiàn)系統(tǒng)的高可用、易伸縮、可擴(kuò)展等目標(biāo)就顯得越發(fā)重要。

為了解決這一系列問題,系統(tǒng)架構(gòu)也在不斷演進(jìn)。傳統(tǒng)的集中式系統(tǒng)已經(jīng)逐漸無法滿足要求,分布式系統(tǒng)被使用在更多的場(chǎng)景中。

分布式系統(tǒng)由獨(dú)立的服務(wù)器通過網(wǎng)絡(luò)松散耦合組成。在這個(gè)系統(tǒng)中每個(gè)服務(wù)器都是一臺(tái)獨(dú)立的主機(jī),服務(wù)器之間通過內(nèi)部網(wǎng)絡(luò)連接。分布式系統(tǒng)有以下幾個(gè)特點(diǎn):

  • 可擴(kuò)展性:可通過橫向水平擴(kuò)展提高系統(tǒng)的性能和吞吐量。

  • 高可靠性:高容錯(cuò),即使系統(tǒng)中一臺(tái)或幾臺(tái)故障,系統(tǒng)仍可提供服務(wù)。

  • 高并發(fā)性:各機(jī)器并行獨(dú)立處理和計(jì)算。

  • 廉價(jià)高效:多臺(tái)小型機(jī)而非單臺(tái)高性能機(jī)。


然而,在分布式系統(tǒng)中,其環(huán)境的復(fù)雜度、網(wǎng)絡(luò)的不確定性會(huì)造成諸如時(shí)鐘不一致、“拜占庭將軍問題”(Byzantine failure)等。存在于集中式系統(tǒng)中的機(jī)器宕機(jī)、消息丟失等問題也會(huì)在分布式環(huán)境中變得更加復(fù)雜。

基于分布式系統(tǒng)的這些特征,有兩種問題逐漸成為了分布式環(huán)境中需要重點(diǎn)關(guān)注和解決的典型問題:

  • 互斥性問題。

  • 冪等性問題。


今天我們就針對(duì)這兩個(gè)問題來進(jìn)行分析。


-? ? ?互斥性問題? ? -


先看兩個(gè)常見的例子:

例1:某服務(wù)記錄關(guān)鍵數(shù)據(jù)X,當(dāng)前值為100。A請(qǐng)求需要將X增加200;同時(shí),B請(qǐng)求需要將X減100。

在理想的情況下,A先讀取到X=100,然后X增加200,最后寫入X=300。B請(qǐng)求接著從讀取X=300,減少100,最后寫入X=200。

然而在真實(shí)情況下,如果不做任何處理,則可能會(huì)出現(xiàn):A和B同時(shí)讀取到X=100;A寫入之前B讀取到X;B比A先寫入等情況。

例2:某服務(wù)提供一組任務(wù),A請(qǐng)求隨機(jī)從任務(wù)組中獲取一個(gè)任務(wù);B請(qǐng)求隨機(jī)從任務(wù)組中獲取一個(gè)任務(wù)。

在理想的情況下,A從任務(wù)組中挑選一個(gè)任務(wù),任務(wù)組刪除該任務(wù),B從剩下的的任務(wù)中再挑一個(gè),任務(wù)組刪除該任務(wù)。

同樣的,在真實(shí)情況下,如果不做任何處理,可能會(huì)出現(xiàn)A和B挑中了同一個(gè)任務(wù)的情況。

以上的兩個(gè)例子,都存在操作互斥性的問題。互斥性問題用通俗的話來講,就是對(duì)共享資源的搶占問題。如果不同的請(qǐng)求對(duì)同一個(gè)或者同一組資源讀取并修改時(shí),無法保證按序執(zhí)行,無法保證一個(gè)操作的原子性,那么就很有可能會(huì)出現(xiàn)預(yù)期外的情況。因此操作的互斥性問題,也可以理解為一個(gè)需要保證時(shí)序性、原子性的問題。

在傳統(tǒng)的基于數(shù)據(jù)庫的架構(gòu)中,對(duì)于數(shù)據(jù)的搶占問題往往是通過數(shù)據(jù)庫事務(wù)(ACID)來保證的。在分布式環(huán)境中,出于對(duì)性能以及一致性敏感度的要求,使得分布式鎖成為了一種比較常見而高效的解決方案。

事實(shí)上,操作互斥性問題也并非分布式環(huán)境所獨(dú)有,在傳統(tǒng)的多線程、多進(jìn)程情況下已經(jīng)有了很好的解決方案。因此在研究分布式鎖之前,我們先來分析下這兩種情況的解決方案,以期能夠?qū)?a href="/tags/分布式" target="_blank">分布式鎖的解決方案提供一些實(shí)現(xiàn)思路。


-? ? ?多線程解決方案及原理? ? -


《Thinking in Java》書中寫到:

基本上所有的并發(fā)模式在解決線程沖突問題的時(shí)候,都是采用序列化訪問共享資源的方案。

在多線程環(huán)境中,線程之間因?yàn)楣靡恍┐鎯?chǔ)空間,沖突問題時(shí)有發(fā)生。解決沖突問題最普遍的方式就是用互斥鎖把該資源或?qū)υ撡Y源的操作保護(hù)起來。

Java JDK中提供了兩種互斥鎖Lock和synchronized。不同的線程之間對(duì)同一資源進(jìn)行搶占,該資源通常表現(xiàn)為某個(gè)類的普通成員變量。因此,利用ReentrantLock或者synchronized將共享的變量及其操作鎖住,即可基本解決資源搶占的問題。

下面來簡單聊一聊兩者的實(shí)現(xiàn)原理。


-? ? ?原理? ? -


ReentrantLock

ReentrantLock主要利用CAS CLH隊(duì)列來實(shí)現(xiàn)。它支持公平鎖和非公平鎖,兩者的實(shí)現(xiàn)類似。

  • CAS:Compare and Swap,比較并交換。CAS有3個(gè)操作數(shù):內(nèi)存值V、預(yù)期值A(chǔ)、要修改的新值B。當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時(shí),將內(nèi)存值V修改為B,否則什么都不做。該操作是一個(gè)原子操作,被廣泛的應(yīng)用在Java的底層實(shí)現(xiàn)中。在Java中,CAS主要是由sun.misc.Unsafe這個(gè)類通過JNI調(diào)用CPU底層指令實(shí)現(xiàn)。

  • CLH隊(duì)列:帶頭結(jié)點(diǎn)的雙向非循環(huán)鏈表(如下圖所示):

ReentrantLock的基本實(shí)現(xiàn)可以概括為:先通過CAS嘗試獲取鎖。如果此時(shí)已經(jīng)有線程占據(jù)了鎖,那就加入CLH隊(duì)列并且被掛起。當(dāng)鎖被釋放之后,排在CLH隊(duì)列隊(duì)首的線程會(huì)被喚醒,然后CAS再次嘗試獲取鎖。在這個(gè)時(shí)候,如果:

  • 非公平鎖:如果同時(shí)還有另一個(gè)線程進(jìn)來嘗試獲取,那么有可能會(huì)讓這個(gè)線程搶先獲?。?/span>

  • 公平鎖:如果同時(shí)還有另一個(gè)線程進(jìn)來嘗試獲取,當(dāng)它發(fā)現(xiàn)自己不是在隊(duì)首的話,就會(huì)排到隊(duì)尾,由隊(duì)首的線程獲取到鎖。


下面分析下兩個(gè)片段:

final?boolean?nonfairTryAcquire(int?acquires)?{
? ?final?Thread current = Thread.currentThread();
? ?int?c = getState();
? ?if?(c ==?0) {
? ? ? ?if?(compareAndSetState(0, acquires)) {
? ? ? ? ? ?setExclusiveOwnerThread(current);
? ? ? ? ? ?return?true;
? ? ? ?}
? ?}
? ?else?if?(current == getExclusiveOwnerThread()) {
? ? ? ?int?nextc = c acquires;
? ? ? ?if?(nextc 0
)?// overflow
? ? ? ? ? ?throw?new?Error("Maximum lock count exceeded");
? ? ? ?setState(nextc);
? ? ? ?return?true;
? ?}
? ?return?false;
}

在嘗試獲取鎖的時(shí)候,會(huì)先調(diào)用上面的方法。如果狀態(tài)為0,則表明此時(shí)無人占有鎖。此時(shí)嘗試進(jìn)行set,一旦成功,則成功占有鎖。如果狀態(tài)不為0,再判斷是否是當(dāng)前線程獲取到鎖。如果是的話,將狀態(tài) 1,因?yàn)榇藭r(shí)就是當(dāng)前線程,所以不用CAS。這也就是可重入鎖的實(shí)現(xiàn)原理。

final?boolean?acquireQueued(final?Node node,?int?arg)?{
? ?boolean?failed =?true;
? ?try?{
? ? ? ?boolean?interrupted =?false;
? ? ? ?for?(;;) {
? ? ? ? ? ?final?Node p = node.predecessor();
? ? ? ? ? ?if?(p == head
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉