溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

redisson的WatchDog是如何看家護(hù)院的

發(fā)布時(shí)間:2021-10-20 18:06:03 來(lái)源:億速云 閱讀:275 作者:柒染 欄目:大數(shù)據(jù)

redisson的WatchDog是如何看家護(hù)院的,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

 上一文,我們分析了redisson加鎖的過(guò)程,總結(jié)來(lái)說(shuō),流程不復(fù)雜,代碼也很直觀,主要是異步通過(guò)lua腳本執(zhí)行了加鎖的邏輯。其中,我們注意到了一些細(xì)節(jié),比如 RedissonLock中的變量internalLockLeaseTime,默認(rèn)值是30000毫秒,還有調(diào)用tryLockInnerAsync()傳入的一個(gè)從連接管理器獲取的getLockWatchdogTimeout(),他的默認(rèn)值也是30000毫秒,這些都和redisson官方文檔所說(shuō)的watchdog機(jī)制有關(guān),看門狗,還是很形象的描述這一機(jī)制,那么看門狗到底做了什么,為什么怎么做呢?下面我們就來(lái)分析和探討一下。

      我們先思考一個(gè)問(wèn)題,假設(shè)在一個(gè)分布式環(huán)境下,多個(gè)服務(wù)實(shí)例請(qǐng)求獲取鎖,其中服務(wù)實(shí)例1成功獲取到了鎖,在執(zhí)行業(yè)務(wù)邏輯的過(guò)程中,服務(wù)實(shí)例突然掛掉了或者h(yuǎn)ang住了,那么這個(gè)鎖會(huì)不會(huì)釋放,什么時(shí)候釋放?回答這個(gè)問(wèn)題,自然想起來(lái)之前我們分析的lua腳本,其中第一次加鎖的時(shí)候使用pexpire給鎖key設(shè)置了過(guò)期時(shí)間,默認(rèn)30000毫秒,由此來(lái)看如果服務(wù)實(shí)例宕機(jī)了,鎖最終也會(huì)釋放,其他服務(wù)實(shí)例也是可以繼續(xù)獲取到鎖執(zhí)行業(yè)務(wù)。但是要是30000毫秒之后呢,要是服務(wù)實(shí)例1沒(méi)有宕機(jī)但是業(yè)務(wù)執(zhí)行還沒(méi)有結(jié)束,所釋放掉了就會(huì)導(dǎo)致線程問(wèn)題,這個(gè)redisson是怎么解決的呢?這個(gè)就一定要實(shí)現(xiàn)自動(dòng)延長(zhǎng)鎖有效期的機(jī)制。

      之前,我們分析到異步執(zhí)行完lua腳本執(zhí)行完成之后,設(shè)置了一個(gè)監(jiān)聽器,來(lái)處理異步執(zhí)行結(jié)束之后的一些工作。如圖所示,在操作完成之后會(huì)

去執(zhí)行operationComplete方法,先判斷這個(gè)異步操作有沒(méi)有執(zhí)行成功,如果沒(méi)有成功,直接返回,如果執(zhí)行成功了,就會(huì)同步獲取結(jié)果,如果ttlRemaining為null,則會(huì)執(zhí)行一個(gè)定時(shí)調(diào)度的方法scheduleExpirationRenewal,回想一下之前的lua腳本,當(dāng)加鎖邏輯

處理結(jié)束,返回了一個(gè)nil;如此說(shuō)來(lái) 就一定會(huì)走定時(shí)任務(wù)了。我們接下去看看定時(shí)任務(wù)的邏輯是什么樣子的。

首先,會(huì)先判斷在expirationRenewalMap中是否存在了entryName,這是個(gè)map結(jié)構(gòu),主要還是判斷在這個(gè)服務(wù)實(shí)例中的加鎖客戶端的鎖key是否存在,如果已經(jīng)存在了,就直接返回;第一次加鎖,肯定是不存在的,接下來(lái)就是搞了一個(gè)TimeTask,延遲internalLockLeaseTime/3之后執(zhí)行,這里就用到了文章一開始就提到奇妙的變量,算下來(lái)就是大約10秒鐘執(zhí)行一次,調(diào)用了一個(gè)異步執(zhí)行的方法

renewExpirationAsync方法,也是調(diào)用異步執(zhí)行了一段lua腳本,首先判

斷這個(gè)鎖key的map結(jié)構(gòu)中是否存在對(duì)應(yīng)的key8a9649f5-f5b5-48b4-beaa-d0c24855f9ab:anyLock:1,如果存在,就直接調(diào)用pexpire命令設(shè)置鎖key的過(guò)期時(shí)間,默認(rèn)30000毫秒。

OK,現(xiàn)在思路就清晰了,在上面任務(wù)調(diào)度的方法中,也是異步執(zhí)行并且設(shè)置了一個(gè)監(jiān)聽器,在操作執(zhí)行成功之后,會(huì)回調(diào)這個(gè)方法,如果調(diào)用失敗會(huì)打一個(gè)錯(cuò)誤日志并返回,更新鎖過(guò)期時(shí)間失??;然后獲取異步執(zhí)行的結(jié)果,如果為true,就會(huì)調(diào)用本身,如此說(shuō)來(lái)又會(huì)延遲10秒鐘去執(zhí)行這段邏輯,所以,這段邏輯在你成功獲取到鎖之后,會(huì)每隔十秒鐘去執(zhí)行一次,并且,在鎖key還沒(méi)有失效的情況下,會(huì)把鎖的過(guò)期時(shí)間繼續(xù)延長(zhǎng)到30000毫秒,也就是說(shuō)只要這臺(tái)服務(wù)實(shí)例沒(méi)有掛掉,并且沒(méi)有主動(dòng)釋放鎖,看門狗都會(huì)每隔十秒給你續(xù)約一下,保證鎖一直在你手中。完美的操作。

到現(xiàn)在來(lái)說(shuō),加鎖,鎖自動(dòng)延長(zhǎng)過(guò)期時(shí)間,都OK了,然后就是說(shuō)在你執(zhí)行業(yè)務(wù),持有鎖的這段時(shí)間,別的服務(wù)實(shí)例來(lái)嘗試加鎖又會(huì)發(fā)生什么情況呢?或者當(dāng)前客戶端的別的線程來(lái)獲取鎖呢?很顯然,肯定會(huì)阻塞住,我們來(lái)通過(guò)代碼看看是怎么做到的。還是把眼光放到之前分析的那段加鎖lua代碼上,當(dāng)加鎖的鎖key存在的時(shí)候并

且鎖key對(duì)應(yīng)的map結(jié)構(gòu)中當(dāng)前客戶端的唯一key也存在時(shí),會(huì)去調(diào)用hincrby命令,將唯一key的值自增一,并且會(huì)pexpire設(shè)置key的過(guò)期時(shí)間為30000毫秒,然后返回nil,可以想象這里也是加鎖成功的,也會(huì)繼續(xù)去執(zhí)行定時(shí)調(diào)度任務(wù),完成鎖key過(guò)期時(shí)間的續(xù)約,這里呢,就實(shí)現(xiàn)了鎖的可重入性。

那么當(dāng)以上這種情況也沒(méi)有發(fā)生呢,這里就會(huì)直接返回當(dāng)前鎖的剩余有效期,相應(yīng)的也不會(huì)去執(zhí)行續(xù)約邏輯。此時(shí)一直返回到上面的方法,如下圖,如果加鎖成功就直接返回

否則就會(huì)進(jìn)入一個(gè)死循環(huán),去嘗試加鎖,并且也會(huì)在等待一段時(shí)間之后一直循環(huán)嘗試加鎖,阻塞住,知道第一個(gè)服務(wù)實(shí)例釋放鎖。對(duì)于不同的服務(wù)實(shí)例嘗試會(huì)獲取一把鎖,也和上面的邏輯類似,都是這樣實(shí)現(xiàn)了鎖的互斥。

緊接著,我們來(lái)看看鎖釋放的邏輯,其實(shí)也很簡(jiǎn)單,調(diào)用了lock.unlock()方法,跟著代碼走流程發(fā)現(xiàn),也是異步調(diào)用了一段lua腳本,

現(xiàn)在再看lua腳本,應(yīng)該就比較清晰,也就是通過(guò)判斷鎖key是否存在,如果不存在直接返回;否則就會(huì)判斷當(dāng)前客戶端對(duì)應(yīng)的唯一key的值是否存在,如果不存在就會(huì)返回nil;否則,值自增-1,判斷唯一key的值是否大于零,如果大于零,則返回0;否則刪除當(dāng)前鎖key,并返回1;返回到上一層方法,也是針對(duì)返回值進(jìn)行了操作,如果返回值是1,則會(huì)去取消之前的

定時(shí)續(xù)約任務(wù),如果失敗了,則會(huì)做一些類似設(shè)置狀態(tài)的操作,這一些和解鎖邏輯也沒(méi)有什么關(guān)系,可以不去看他。

總結(jié)一下,redisson的加鎖和解鎖流程我們也跟完了,現(xiàn)在來(lái)說(shuō),redis分布式鎖,redisson去加鎖,也就是去redis集群中選擇一臺(tái)master實(shí)例去實(shí)現(xiàn)鎖機(jī)制,并且能因?yàn)橐慌_(tái)master可能會(huì)掛載多臺(tái)slave實(shí)例,這樣也就實(shí)現(xiàn)了高可用性。但是呢,不得不去思考,如果master和salve同步的過(guò)程中,master宕機(jī)了,偏偏在這之前某個(gè)服務(wù)實(shí)例剛剛寫入了一把鎖,這時(shí)候就尷尬了,salve還沒(méi)有同步到這把鎖,就被切換成了master,那么這時(shí)候可以說(shuō)就有問(wèn)題了,另一個(gè)服務(wù)實(shí)例在新的master上獲取到一把新鎖,這時(shí)候就會(huì)出現(xiàn)倆臺(tái)服務(wù)實(shí)例都持有鎖,執(zhí)行業(yè)務(wù)邏輯的場(chǎng)景,這個(gè)是有問(wèn)題的。也是在生產(chǎn)環(huán)境中我們需要去考慮的一個(gè)問(wèn)題。
redisson的WatchDog是如何看家護(hù)院的

關(guān)于redisson的WatchDog是如何看家護(hù)院的問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI