本申請涉及分布式應(yīng)用領(lǐng)域,尤其涉及一種分布式鎖服務(wù)方法、獲取方法及相應(yīng)裝置。
背景技術(shù):
在分布式應(yīng)用中,往往會遇到多個進(jìn)程提供同一服務(wù)的情況,這些進(jìn)程用于對共享資源直接發(fā)起訪問,或?qū)δ軌蛑苯釉L問共享資源的相應(yīng)任務(wù)或作業(yè)進(jìn)行管理控制。因此在訪問共享資源或?qū)ο鄳?yīng)任務(wù)以及作業(yè)進(jìn)行管理控制的時候,還需要采用一定手段來防止各進(jìn)程彼此間的干擾,從而保證服務(wù)和數(shù)據(jù)的一致性,分布式鎖機(jī)制便是通常采用的一種手段,即進(jìn)程在對共享資源直接發(fā)起訪問前,或?qū)δ軌蛑苯釉L問共享資源的各任務(wù)以及作業(yè)進(jìn)行管理控制前,需獲取與所述共享資源或所述任務(wù)以及作業(yè)對應(yīng)的唯一的分布式鎖,由此來保證服務(wù)和數(shù)據(jù)的一致性。
同時,在分布式應(yīng)用中,高可用性集群(HA)是一種有效保證業(yè)務(wù)連續(xù)性的分布式解決方案,對應(yīng)該解決方案,基于高可用性的分布式鎖(HA lock)是常用的一種分布式鎖,例如基于Zookeeper(一種開源的分布式應(yīng)用程序協(xié)調(diào)服務(wù)系統(tǒng))實現(xiàn)的分布式鎖。在應(yīng)用了基于高可用性的分布式鎖的大型分布式系統(tǒng)中,常見的一種場景是將系統(tǒng)中用于對共享資源直接發(fā)起訪問,或?qū)δ軌蛑苯釉L問共享資源的相應(yīng)任務(wù)或作業(yè)進(jìn)行管理控制的進(jìn)程,分布在分布式系統(tǒng)中的各個機(jī)器節(jié)點上,則這些進(jìn)程往往作為節(jié)點進(jìn)程由分布式系統(tǒng)的調(diào)度器管理,并提供直接訪問共享資源的服務(wù),或提供對能夠直接訪問共享資源的相應(yīng)任務(wù)或作業(yè)進(jìn)行管理控制的服務(wù)。在這種場景下,若由于網(wǎng)絡(luò)或節(jié)點內(nèi)硬件不能穩(wěn)定運行等原因,需要令原進(jìn)程退出并放鎖,且將原進(jìn)程所提供的服務(wù)遷移至新進(jìn)程時,若是因為網(wǎng)絡(luò)故障導(dǎo)致原節(jié)點進(jìn)程與分布式系統(tǒng)的調(diào)度器的通信處于故障狀態(tài)而發(fā)生的遷移,那么原節(jié)點進(jìn)程一直無法收到退出命令,因此它持有的鎖也不會退出或超時,同時,新節(jié)點進(jìn)程將一直無法獲得鎖,進(jìn)而導(dǎo)致系統(tǒng)無法提供相應(yīng)的服務(wù)。另外,對于應(yīng)用了基于高可用性的分布式鎖的大型分布式系統(tǒng),進(jìn)程重啟是一種最常見的故障場景,該故障需要重啟后的進(jìn)程能夠立即拿到鎖,基于高可用性的分布式鎖便能夠有效的實現(xiàn)該功能?;诟呖捎眯? 的分布式鎖實現(xiàn)該功能的具體方法是給鎖的持有者維護(hù)一定時間段的租約期,在租約期內(nèi),其它人無法拿到鎖,從而保證重啟后的原進(jìn)程能夠立即拿到鎖。但由于租約期的存在,若是發(fā)生將原進(jìn)程所提供的服務(wù)遷移至新進(jìn)程的情況,則新進(jìn)程需要等待原進(jìn)程所持有的鎖超時后,即超過租約期,才能拿到鎖,導(dǎo)致遷移過程中原進(jìn)程不能快速放鎖,并且在等待時間內(nèi)系統(tǒng)無法提供相應(yīng)的服務(wù)。
綜上,在原節(jié)點進(jìn)程所提供的服務(wù)遷移至另一節(jié)點進(jìn)程時,或原節(jié)點進(jìn)程重啟時,或其它場景下需要原來持有分布式鎖的節(jié)點進(jìn)程或其它種類進(jìn)程主動快速退出且完成放鎖處理時,在傳統(tǒng)的分布式鎖機(jī)制下,原節(jié)點進(jìn)程或原來持有分布式鎖的各類進(jìn)程必須等待當(dāng)前持有的分布式鎖超時或收到退出命令才能執(zhí)行退出操作,進(jìn)而完成放鎖處理,該方法有如下缺點:
1、需要重新獲得分布式鎖的進(jìn)程或節(jié)點進(jìn)程不能快速獲得鎖,導(dǎo)致系統(tǒng)長時間不能提供相應(yīng)的服務(wù)。
2、當(dāng)原進(jìn)程或原節(jié)點進(jìn)程不能正常退出時,或?qū)?dǎo)致多個進(jìn)程提供同一服務(wù),或使新的進(jìn)程無法拿到鎖,從而使服務(wù)和數(shù)據(jù)的一致性無法保證,或使系統(tǒng)不能提供相應(yīng)的服務(wù),從而導(dǎo)致系統(tǒng)的服務(wù)故障和數(shù)據(jù)的處理錯誤。
技術(shù)實現(xiàn)要素:
本申請?zhí)峁┮环N分布式鎖服務(wù)方法、獲取方法及相應(yīng)裝置,以解決現(xiàn)有的分布式鎖機(jī)制不能使需要重新獲得分布式鎖的進(jìn)程或節(jié)點進(jìn)程不能快速獲得鎖,以及當(dāng)前持有分布式鎖的進(jìn)程或節(jié)點進(jìn)程不能正常退出的問題。
為解決上述技術(shù)問題,本申請?zhí)峁┑姆植际芥i服務(wù)方法,包括:
分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程或當(dāng)前已持有分布式鎖的節(jié)點進(jìn)程,實時接收包含與本節(jié)點進(jìn)程待獲取的或已持有的所述分布式鎖相對應(yīng)的最新鎖版本的數(shù)據(jù);所述鎖版本的高低用于標(biāo)識各所述節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的高低;
根據(jù)所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成的所述節(jié)點進(jìn)程的專有鎖版本,所述節(jié)點進(jìn)程判斷所述最新鎖版本是否高于所述專有鎖版本;
所述節(jié)點進(jìn)程根據(jù)本節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài),以及所述 是否高于的判斷結(jié)果,進(jìn)行釋放、獲取或等待所述分布式鎖的相應(yīng)處理。
優(yōu)選的,所述的所述節(jié)點進(jìn)程根據(jù)本節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài),以及所述是否高于的判斷結(jié)果,進(jìn)行釋放、獲取或等待所述分布式鎖的相應(yīng)處理,具體包括:
若所述節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài)為已持有所述分布式鎖,則執(zhí)行以下步驟:
若所述是否高于的判斷結(jié)果為是,則所述節(jié)點進(jìn)程釋放其持有的所述分布式鎖,
若所述是否高于的判斷結(jié)果為否,則所述節(jié)點進(jìn)程繼續(xù)持有所述分布式鎖,并以所述節(jié)點進(jìn)程的所述專有鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù);
若所述節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài)為待獲取所述分布式鎖,則執(zhí)行以下步驟:
若所述是否高于的判斷結(jié)果為是,則所述節(jié)點進(jìn)程在等鎖隊列中等待,
若所述是否高于的判斷結(jié)果為否,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理,并以所述節(jié)點進(jìn)程的所述專有鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù)。
可選的,在所述的所述節(jié)點進(jìn)程根據(jù)本節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài),以及所述是否高于的判斷結(jié)果,進(jìn)行釋放、獲取或等待所述分布式鎖的相應(yīng)處理的具體步驟中,對于其中的所述若所述是否高于的判斷結(jié)果為否,則所述節(jié)點進(jìn)程繼續(xù)持有所述分布式鎖,并以所述節(jié)點進(jìn)程的所述專有鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù)來說,若所述節(jié)點進(jìn)程持有所述分布式鎖,且繼續(xù)持有所述分布式鎖直至所述節(jié)點進(jìn)程完成該節(jié)點進(jìn)程被分配的所有服務(wù)后,包括:
所述分布式系統(tǒng)刪除與所述分布式鎖相對應(yīng)的所述最新鎖版本數(shù)據(jù)。
優(yōu)選的,所述預(yù)先生成的所述節(jié)點進(jìn)程的專有鎖版本,具體包括:
分布式系統(tǒng)在生成所述節(jié)點進(jìn)程的同時,根據(jù)所述節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的全局狀態(tài)變量,生成所述節(jié)點進(jìn)程專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本;所述全局狀態(tài)變量用于記錄所述分布式鎖的最新鎖版本的值;和/或,
分布式系統(tǒng)在已持有分布式鎖的所述節(jié)點進(jìn)程重啟時,保留所述節(jié)點進(jìn)程 重啟前所專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本。
可選的,所述分布式系統(tǒng)在生成所述節(jié)點進(jìn)程的同時,根據(jù)所述節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的全局狀態(tài)變量,生成所述節(jié)點進(jìn)程專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本,包括:
分布式系統(tǒng)在生成所述節(jié)點進(jìn)程的同時,或在已持有分布式鎖的所述節(jié)點進(jìn)程重啟的同時,讀取所述節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的全局狀態(tài)變量;
判斷所述分布式鎖的全局狀態(tài)變量是否存在;
若所述全局狀態(tài)變量不存在,則生成和初始化所述全局狀態(tài)變量,并進(jìn)入下一步,若所述全局狀態(tài)變量存在,則將所述全局狀態(tài)變量的值自增1,并進(jìn)入下一步;
以所述全局狀態(tài)變量的值為鎖版本的值,生成所述節(jié)點進(jìn)程專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本。
可選的,所述生成和初始化所述全局狀態(tài)變量,具體包括:
生成所述全局狀態(tài)變量;
以所述分布式系統(tǒng)的當(dāng)前時間戳作為初始值,初始化所述全局狀態(tài)變量。
優(yōu)選的,在所述根據(jù)所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成的所述節(jié)點進(jìn)程的專有鎖版本,所述節(jié)點進(jìn)程判斷所述最新鎖版本是否高于所述專有鎖版本的步驟中,判斷的具體步驟是:
判斷所述節(jié)點進(jìn)程實時接收的所述最新鎖版本的值是否大于所述節(jié)點進(jìn)程的所述專有鎖版本的值;
若大于,則表示所述最新鎖版本高于所述專有鎖版本;
若不大于,則表示所述最新鎖版本不高于所述專有鎖版本。
可選的,在所述實時接收包含與本節(jié)點進(jìn)程待獲取的或已持有的所述分布式鎖相對應(yīng)的最新鎖版本的數(shù)據(jù)的步驟中,所述最新鎖版本的數(shù)據(jù)具體是以數(shù)據(jù)文件的形式被存儲記錄;
相應(yīng)的,所述分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程或當(dāng)前已持有分布 式鎖的節(jié)點進(jìn)程,實時接收包含與本節(jié)點進(jìn)程待獲取的或已持有的所述分布式鎖相對應(yīng)的最新鎖版本的數(shù)據(jù),包括:
分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程或當(dāng)前已持有分布式鎖的節(jié)點進(jìn)程,訂閱所述數(shù)據(jù)文件的相應(yīng)數(shù)據(jù);所述訂閱,是指用于關(guān)聯(lián)所述節(jié)點進(jìn)程與所述數(shù)據(jù)文件中與該節(jié)點進(jìn)程對應(yīng)的所述最新鎖版本數(shù)據(jù),即通過訂閱,所述節(jié)點進(jìn)程能夠?qū)εc之對應(yīng)的所述最新鎖版本數(shù)據(jù)發(fā)起寫操作,且當(dāng)與之對應(yīng)的所述最新鎖版本數(shù)據(jù)發(fā)生更新時,所述節(jié)點進(jìn)程能夠?qū)崟r得到更新后的所述最新鎖版本數(shù)據(jù);
所述節(jié)點進(jìn)程實時接收其訂閱的所述數(shù)據(jù)文件中的數(shù)據(jù),即實時接收包含與本節(jié)點進(jìn)程待獲取的或已持有的所述分布式鎖相對應(yīng)的最新鎖版本的數(shù)據(jù)。
可選的,所述的所述最新鎖版本的數(shù)據(jù)具體是以數(shù)據(jù)文件的形式被存儲記錄,是指與各個分布式鎖對應(yīng)的最新鎖版本的數(shù)據(jù)分別以單獨的數(shù)據(jù)文件的形式被存儲記錄,即存儲所述最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件與所述分布式鎖一一對應(yīng)。
可選的,在所述根據(jù)所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成的所述節(jié)點進(jìn)程的專有鎖版本,所述節(jié)點進(jìn)程判斷所述最新鎖版本是否高于所述專有鎖版本的步驟前,執(zhí)行以下步驟:
根據(jù)所述節(jié)點進(jìn)程實時接收的訂閱數(shù)據(jù),判斷與所述節(jié)點進(jìn)程訂閱的數(shù)據(jù)對應(yīng)的所述數(shù)據(jù)文件是否存在;
若不存在,則新建存儲相應(yīng)最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件,繼而執(zhí)行所述根據(jù)所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成的所述節(jié)點進(jìn)程的專有鎖版本,所述節(jié)點進(jìn)程判斷所述最新鎖版本是否高于所述專有鎖版本的步驟;
若存在,則執(zhí)行所述根據(jù)所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成的所述節(jié)點進(jìn)程的專有鎖版本,所述節(jié)點進(jìn)程判斷所述最新鎖版本是否高于所述專有鎖版本的步驟。
可選的,在所述的所述節(jié)點進(jìn)程實時接收其訂閱的所述數(shù)據(jù)文件中的數(shù)據(jù)的步驟中,所述節(jié)點進(jìn)程與所述數(shù)據(jù)文件間的數(shù)據(jù)傳輸所使用的網(wǎng)絡(luò)通道,與所述節(jié)點進(jìn)程與所述分布式鎖的提供者間的數(shù)據(jù)傳輸所使用的網(wǎng)絡(luò)通道相同。
相應(yīng)的,本申請還提供分布式鎖獲取方法,包括:
分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程,發(fā)起獲取與本節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的請求;
根據(jù)所述請求中關(guān)于待獲取的所述分布式鎖的相關(guān)信息,實時接收當(dāng)前存儲的與所述分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù);所述鎖版本的高低用于標(biāo)識各所述節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的高低;
根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本;
若判斷結(jié)果為是,則將所述節(jié)點進(jìn)程加入等鎖隊列中等待;
若判斷結(jié)果為否,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理。
優(yōu)選的,所述的所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理,包括:
所述節(jié)點進(jìn)程將所述節(jié)點進(jìn)程的所述專有鎖版本作為當(dāng)前的最新鎖版本,并以該當(dāng)前的最新鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù);
所述分布式系統(tǒng)將更新后的所述最新鎖版本數(shù)據(jù)推送給當(dāng)前已持有所述分布式鎖的或其它等待獲取所述分布式鎖的各節(jié)點進(jìn)程;
基于傳統(tǒng)分布式鎖獲取機(jī)制,所述節(jié)點進(jìn)程嘗試獲取所述分布式鎖,進(jìn)而提供服務(wù)。
優(yōu)選的,所述預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,具體包括:
分布式系統(tǒng)在生成所述節(jié)點進(jìn)程的同時,根據(jù)所述節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的全局狀態(tài)變量,生成所述節(jié)點進(jìn)程專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本;所述全局狀態(tài)變量用于記錄所述分布式鎖的最新鎖版本的值;和/或,
分布式系統(tǒng)在已持有分布式鎖的所述節(jié)點進(jìn)程重啟時,保留所述節(jié)點進(jìn)程重啟前所專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本。
可選的,所述分布式系統(tǒng)在生成所述節(jié)點進(jìn)程的同時,根據(jù)所述節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的全局狀態(tài)變量,生成所述節(jié)點進(jìn)程專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本,包括:
分布式系統(tǒng)在生成所述節(jié)點進(jìn)程的同時,或在已持有分布式鎖的所述節(jié)點進(jìn)程重啟的同時,讀取所述節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的全局狀態(tài)變量;
判斷所述分布式鎖的全局狀態(tài)變量是否存在;
若所述全局狀態(tài)變量不存在,則生成和初始化所述全局狀態(tài)變量,并進(jìn)入下一步,若所述全局狀態(tài)變量存在,則將所述全局狀態(tài)變量的值自增1,并進(jìn)入下一步;
以所述全局狀態(tài)變量的值為鎖版本的值,生成所述節(jié)點進(jìn)程專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本。
可選的,所述生成和初始化所述全局狀態(tài)變量,具體包括:
生成所述全局狀態(tài)變量;
以所述分布式系統(tǒng)的當(dāng)前時間戳作為初始值,初始化所述全局狀態(tài)變量。
可選的,在所述根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本的步驟中,判斷的具體步驟是:
判斷所述節(jié)點進(jìn)程實時接收的所述最新鎖版本的值是否大于所述節(jié)點進(jìn)程的所述專有的鎖版本的值;
若大于,則表示所述最新鎖版本高于所述專有鎖版本;
若不大于,則表示所述最新鎖版本不高于所述專有鎖版本。
可選的,在所述實時接收當(dāng)前存儲的與所述分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù)的步驟中,所述最新鎖版本數(shù)據(jù)具體是以數(shù)據(jù)文件的形式被存儲記錄;
相應(yīng)的,所述根據(jù)所述請求中關(guān)于待獲取的所述分布式鎖的相關(guān)信息,實時接收當(dāng)前存儲的與所述分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù),包括:
所述節(jié)點進(jìn)程訂閱所述數(shù)據(jù)文件的相應(yīng)數(shù)據(jù);所述訂閱,是指用于關(guān)聯(lián)所述節(jié)點進(jìn)程與所述數(shù)據(jù)文件中與該節(jié)點進(jìn)程對應(yīng)的所述最新鎖版本數(shù)據(jù),即通過訂閱,所述節(jié)點進(jìn)程能夠?qū)εc之對應(yīng)的所述最新鎖版本數(shù)據(jù)發(fā)起寫操作,且當(dāng)與之對應(yīng)的所述最新鎖版本數(shù)據(jù)發(fā)生更新時,所述節(jié)點進(jìn)程能夠?qū)崟r得到更新后的所述最新鎖版本數(shù)據(jù),
所述節(jié)點進(jìn)程實時接收其訂閱的所述數(shù)據(jù)文件中的數(shù)據(jù),即實時接收當(dāng)前 存儲的與所述分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù);
相應(yīng)的,所述的所述節(jié)點進(jìn)程將所述節(jié)點進(jìn)程的所述專有鎖版本作為當(dāng)前的最新鎖版本,并以該當(dāng)前的最新鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù),具體是指將所述節(jié)點進(jìn)程的所述專有鎖版本作為當(dāng)前的最新鎖版本,并以該當(dāng)前的最新鎖版本為依據(jù)更新所述數(shù)據(jù)文件中的相應(yīng)最新鎖版本數(shù)據(jù)。
可選的,所述的所述最新鎖版本數(shù)據(jù)具體是以數(shù)據(jù)文件的形式被存儲記錄,是指與各個分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù)分別以單獨的數(shù)據(jù)文件的形式被存儲記錄,即存儲所述最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件與所述分布式鎖一一對應(yīng)。
可選的,所述的所述分布式系統(tǒng)將更新后的所述最新鎖版本數(shù)據(jù)推送給當(dāng)前已持有所述分布式鎖的或其它等待獲取所述分布式鎖的各節(jié)點進(jìn)程,具體是指當(dāng)存儲有所述最新鎖版本數(shù)據(jù)的所述數(shù)據(jù)文件發(fā)生更新時,所述分布式系統(tǒng)將更新后的所述最新鎖版本數(shù)據(jù)推送給當(dāng)前已持有所述分布式鎖的或其它等待獲取所述分布式鎖的各節(jié)點進(jìn)程,即訂閱所述數(shù)據(jù)文件的各節(jié)點進(jìn)程能夠?qū)崟r得到更新后的所述當(dāng)前最新鎖版本數(shù)據(jù)。
可選的,在所述根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本的步驟前,執(zhí)行以下步驟:
根據(jù)所述節(jié)點進(jìn)程實時獲取的訂閱數(shù)據(jù),判斷與所述節(jié)點進(jìn)程訂閱的數(shù)據(jù)對應(yīng)的所述數(shù)據(jù)文件是否存在;
若不存在,則新建存儲相應(yīng)最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件,繼而執(zhí)行所述根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本的步驟;
若存在,則執(zhí)行所述根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本的步驟。
可選的,在所述的所述分布式系統(tǒng)將更新后的所述最新鎖版本數(shù)據(jù)推送給當(dāng)前已持有所述分布式鎖的或其它等待獲取所述分布式鎖的各節(jié)點進(jìn)程的步驟后,若所述最新鎖版本數(shù)據(jù)被推送給所述的其它等待獲取所述分布式鎖的各節(jié)點進(jìn)程,則該些等待獲取所述分布式鎖的各節(jié)點進(jìn)程依次執(zhí)行權(quán)利要求10中所 述的以下步驟:
根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本;
若判斷結(jié)果為是,則將所述節(jié)點進(jìn)程加入等鎖隊列中等待;
若判斷結(jié)果為否,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理。
相應(yīng)的,本申請還提供一種分布式鎖服務(wù)裝置,包括:
最新鎖版本數(shù)據(jù)接收單元,用于分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程或當(dāng)前已持有分布式鎖的節(jié)點進(jìn)程,實時接收包含與本節(jié)點進(jìn)程待獲取的或已持有的所述分布式鎖相對應(yīng)的最新鎖版本的數(shù)據(jù);所述鎖版本的高低用于標(biāo)識各所述節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的高低;
鎖版本判斷單元,用于根據(jù)所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成的所述節(jié)點進(jìn)程的專有鎖版本,所述節(jié)點進(jìn)程判斷所述最新鎖版本是否高于所述專有鎖版本;
分布式鎖處理單元,用于所述節(jié)點進(jìn)程根據(jù)本節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài),以及所述是否高于的判斷結(jié)果,進(jìn)行釋放、獲取或等待所述分布式鎖的相應(yīng)處理。
優(yōu)選的,所述分布式鎖處理單元包括:
分布式鎖第一處理子單元,用于若判斷所述節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài)為已持有所述分布式鎖,且所述是否高于的判斷結(jié)果為是時,則所述節(jié)點進(jìn)程釋放其持有的所述分布式鎖;
分布式鎖第二處理子單元,用于若判斷所述節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài)為已持有所述分布式鎖,且所述是否高于的判斷結(jié)果為否時,則所述節(jié)點進(jìn)程繼續(xù)持有所述分布式鎖,并以所述節(jié)點進(jìn)程的所述專有鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù);
分布式鎖第三處理子單元,用于若判斷所述節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài)為待獲取所述分布式鎖,且所述是否高于的判斷結(jié)果為是時,則所述節(jié)點進(jìn)程在等鎖隊列中等待;
分布式鎖第四處理子單元,用于若判斷所述節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài)為待獲取所述分布式鎖,且所述是否高于的判斷結(jié)果為否時,則所 述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理,并以所述節(jié)點進(jìn)程的所述專有鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù)。
相應(yīng)的,本申請還提供一種分布式鎖獲取裝置,包括:
請求單元,用于分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程,發(fā)起獲取與本節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的請求;
最新鎖版本數(shù)據(jù)接收單元,用于根據(jù)所述請求中關(guān)于待獲取的所述分布式鎖的相關(guān)信息,實時接收當(dāng)前存儲的與所述分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù);所述鎖版本的高低用于標(biāo)識各所述節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的高低;
分布式鎖判斷單元,用于根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本;
分布式鎖處理單元,用于若在分布式鎖判斷單元中的判斷結(jié)果為是,則將所述節(jié)點進(jìn)程加入等鎖隊列中等待;若在分布式鎖判斷單元中的判斷結(jié)果為否,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理。
優(yōu)選的,在所述分布式鎖處理單元中,所述若在分布式鎖判斷單元中的判斷結(jié)果為否,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理,包括:
若判斷結(jié)果為否,則所述節(jié)點進(jìn)程將所述節(jié)點進(jìn)程的所述專有鎖版本作為當(dāng)前的最新鎖版本,并以該當(dāng)前的最新鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù);
所述分布式系統(tǒng)將更新后的所述最新鎖版本數(shù)據(jù)推送給當(dāng)前已持有所述分布式鎖的或其它等待獲取所述分布式鎖的各節(jié)點進(jìn)程;
基于傳統(tǒng)分布式鎖獲取機(jī)制,所述節(jié)點進(jìn)程嘗試獲取所述分布式鎖,進(jìn)而提供服務(wù)。
相應(yīng)的,本申請還提供一種分布式鎖服務(wù)系統(tǒng),包括:
所述系統(tǒng)采用節(jié)點進(jìn)程管理分布式系統(tǒng)中的任務(wù)或作業(yè),當(dāng)所述系統(tǒng)啟動新的節(jié)點進(jìn)程接替原節(jié)點進(jìn)程提供相同的服務(wù),進(jìn)而接替原節(jié)點進(jìn)程管理分布式系統(tǒng)中的任務(wù)或作業(yè)時,各所述節(jié)點進(jìn)程所應(yīng)用的分布式鎖服務(wù),以便獲取或釋放所述分布式鎖時,采用權(quán)利要求1至22中任一所述的分布式鎖服務(wù)方法或分布式鎖獲取方法,從而停止或提供相應(yīng)服務(wù)。
相應(yīng)的,本申請還提供一種電子設(shè)備,包括:
顯示器;
處理器;以及
存儲器,所述存儲器被配置成存儲分布式鎖服務(wù)裝置,和/或,分布式鎖獲取裝置,
所述分布式鎖服務(wù)裝置被所述處理器執(zhí)行時,執(zhí)行如下步驟:
分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程或當(dāng)前已持有分布式鎖的節(jié)點進(jìn)程,實時接收包含與本節(jié)點進(jìn)程待獲取的或已持有的所述分布式鎖相對應(yīng)的最新鎖版本的數(shù)據(jù);所述鎖版本的高低用于標(biāo)識各所述節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的高低;
根據(jù)所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成的所述節(jié)點進(jìn)程的專有鎖版本,所述節(jié)點進(jìn)程判斷所述最新鎖版本是否高于所述專有鎖版本;
所述節(jié)點進(jìn)程根據(jù)本節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài),以及所述是否高于的判斷結(jié)果,進(jìn)行釋放、獲取或等待所述分布式鎖的相應(yīng)處理;
所述分布式鎖獲取裝置被所述處理器執(zhí)行時,執(zhí)行如下步驟:
分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程,發(fā)起獲取與本節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的請求;
根據(jù)所述請求中關(guān)于待獲取的所述分布式鎖的相關(guān)信息,實時接收當(dāng)前存儲的與所述分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù);所述鎖版本的高低用于標(biāo)識各所述節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的高低;
根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本;
若判斷結(jié)果為是,則將所述節(jié)點進(jìn)程加入等鎖隊列中等待;
若判斷結(jié)果為否,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理。
本申請?zhí)峁┑姆植际芥i服務(wù)方法,主要包括分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程或當(dāng)前已持有分布式鎖的節(jié)點進(jìn)程,實時接收包含與本節(jié)點進(jìn)程待獲取的或已持有的所述分布式鎖相對應(yīng)的最新鎖版本的數(shù)據(jù);進(jìn)而根據(jù)各所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成的各所述節(jié)點 進(jìn)程專有鎖版本,各所述節(jié)點進(jìn)程分別判斷本節(jié)點進(jìn)程實時接收的所述最新鎖版本是否高于本節(jié)點進(jìn)程的所述專有鎖版本;繼而各所述節(jié)點進(jìn)程根據(jù)本節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài),以及所述是否高于的判斷結(jié)果,進(jìn)行釋放、獲取或等待所述分布式鎖的相應(yīng)處理。這種方法應(yīng)用在分布式系統(tǒng)中,使得分布式系統(tǒng)中各進(jìn)程能實時享有分布式鎖的使用信息,從而當(dāng)需要當(dāng)前持有分布式鎖的進(jìn)程主動快速退出時或服務(wù)發(fā)生遷移的情況下,當(dāng)前持有分布式鎖的進(jìn)程能夠主動快速退出服務(wù),并將其持有的分布式鎖快速釋放,從而使需要重新獲得分布式鎖的進(jìn)程快速得到鎖。尤其是當(dāng)由于網(wǎng)絡(luò)故障導(dǎo)致原進(jìn)程與分布式系統(tǒng)的調(diào)度器的通信處于故障狀態(tài)而發(fā)生遷移時,或當(dāng)網(wǎng)絡(luò)故障導(dǎo)致原進(jìn)程與分布式系統(tǒng)的調(diào)度器的通信處于故障狀態(tài)而需要原進(jìn)程主動退出時,當(dāng)前持有分布式鎖的進(jìn)程不需要得到退出命令就能夠主動退出服務(wù),繼而快速完成相應(yīng)的放鎖處理,從而使新的進(jìn)程快速獲取相應(yīng)的分布式鎖,進(jìn)一步保證了服務(wù)和數(shù)據(jù)的一致性,以及系統(tǒng)的可靠運行。
附圖說明
圖1是本申請第一實施例提供的分布式鎖服務(wù)方法的流程示意圖。
圖2是第一實施例中實時接收包含最新鎖版本的數(shù)據(jù)的步驟的具體實施方式的流程圖。
圖3是本申請第二實施例提供的分布式鎖獲取方法的流程示意圖。
圖4是第二實施例中實時接收包含最新鎖版本的數(shù)據(jù)的步驟的具體實施方式的流程圖。
圖5是第二實施例中所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理的步驟的具體實施方式的流程圖。
圖6是本申請第三實施例提供的分布式鎖服務(wù)裝置的流程示意圖。
圖7是本申請第四實施例提供的分布式鎖獲取裝置的流程示意圖。
圖8是本申請第五實施例提供的分布式鎖服務(wù)系統(tǒng)的流程示意圖。
具體實施方式
在下面的描述中闡述了很多具體細(xì)節(jié)以便于充分理解本申請。但是本申請能夠以很多不同于在此描述的其它方式來實施,本領(lǐng)域技術(shù)人員可以在不違背本申請內(nèi)涵的情況下做類似推廣,因此本申請不受下面公開的具體實施的限制。
在本申請中,分別提供了一種分布式鎖服務(wù)方法、獲取方法及相應(yīng)裝置,在下面的實施例中逐一進(jìn)行詳細(xì)說明。本實施例假定用于分布式系統(tǒng)中,各節(jié)點進(jìn)程提供直接訪問共享資源的服務(wù),或提供對能夠直接訪問共享資源的相應(yīng)任務(wù)或作業(yè)進(jìn)行管理控制的服務(wù)這一應(yīng)用場景,以下說明主要結(jié)合此應(yīng)用場景,同時兼顧其他應(yīng)用場景的情況。
請參考圖1,其為本申請第一實施例提供的分布式鎖服務(wù)方法的流程示意圖。所述方法包括如下步驟:
步驟101:分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程或當(dāng)前已持有分布式鎖的節(jié)點進(jìn)程,實時接收包含與本節(jié)點進(jìn)程待獲取的或已持有的所述分布式鎖相對應(yīng)的最新鎖版本的數(shù)據(jù);所述鎖版本的高低用于標(biāo)識各所述節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的高低。
在本實施例中,所述最新鎖版本數(shù)據(jù)是以數(shù)據(jù)文件的形式被存儲記錄。相應(yīng)的,所述分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程或當(dāng)前已持有分布式鎖的節(jié)點進(jìn)程,實時接收包含與本節(jié)點進(jìn)程待獲取的或已持有的所述分布式鎖相對應(yīng)的最新鎖版本的數(shù)據(jù),是通過訂閱上述數(shù)據(jù)文件的方式進(jìn)行的。圖2為第一實施例中實時接收包含最新鎖版本的數(shù)據(jù)的步驟的具體實施方式的流程圖。具體步驟包括:
步驟201:分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程或當(dāng)前已持有分布式鎖的節(jié)點進(jìn)程,訂閱所述數(shù)據(jù)文件的相應(yīng)數(shù)據(jù);所述訂閱,是指用于關(guān)聯(lián)所述節(jié)點進(jìn)程與所述數(shù)據(jù)文件中與該節(jié)點進(jìn)程對應(yīng)的所述最新鎖版本數(shù)據(jù),即通過訂閱,所述節(jié)點進(jìn)程能夠?qū)εc之對應(yīng)的所述最新鎖版本數(shù)據(jù)發(fā)起寫操作,且當(dāng)與之對應(yīng)的所述最新鎖版本數(shù)據(jù)發(fā)生更新時,所述節(jié)點進(jìn)程能夠?qū)崟r得到更新后的所述最新鎖版本數(shù)據(jù)。
步驟202:所述節(jié)點進(jìn)程實時接收其訂閱的所述數(shù)據(jù)文件中的數(shù)據(jù),即實時接收包含與本節(jié)點進(jìn)程待獲取的或已持有的所述分布式鎖相對應(yīng)的最新鎖版本的數(shù)據(jù)。
通常在分布式系統(tǒng)中,分布式鎖由系統(tǒng)中的提供分布式鎖服務(wù)的組件管理和提供,在本申請中,存儲最新鎖版本數(shù)據(jù)的文件也由單獨的組件管理。對于本實施例,與各個分布式鎖對應(yīng)的最新鎖版本的數(shù)據(jù)分別以單獨的數(shù)據(jù)文件的形式被存儲記錄,即存儲所述最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件與所述分布式鎖一一 對應(yīng)。這些數(shù)據(jù)文件由版本數(shù)據(jù)文件組件統(tǒng)一管理,例如數(shù)據(jù)文件的新建、更新和刪除操作都需要通過版本數(shù)據(jù)文件組件完成,且各數(shù)據(jù)文件和各節(jié)點進(jìn)程間的數(shù)據(jù)傳輸也通過版本數(shù)據(jù)文件組件完成。
此外,為了防止在節(jié)點進(jìn)程需要快速釋放鎖時,恰巧發(fā)生與鎖版本數(shù)據(jù)文件組件的網(wǎng)絡(luò)不通,導(dǎo)致不能獲取最新鎖版本數(shù)據(jù)的情況下,本申請所述的方法失效,需要確保所述節(jié)點進(jìn)程與所述數(shù)據(jù)文件間的數(shù)據(jù)傳輸所使用的網(wǎng)絡(luò)通道,與所述節(jié)點進(jìn)程與所述分布式鎖的提供者間的數(shù)據(jù)傳輸所使用的網(wǎng)絡(luò)通道相同。從而,如果所述節(jié)點進(jìn)程與所述鎖版本數(shù)據(jù)文件組件的網(wǎng)絡(luò)不通,即所述節(jié)點進(jìn)程與所述數(shù)據(jù)文件間的網(wǎng)絡(luò)不通時,所述節(jié)點進(jìn)程與所述分布式鎖的提供者間的網(wǎng)絡(luò)通道也不通,進(jìn)而使所述節(jié)點進(jìn)程的分布式鎖超時,隨即所述節(jié)點進(jìn)程退出服務(wù)并釋放鎖。
步驟102:根據(jù)所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成的所述節(jié)點進(jìn)程的專有鎖版本,所述節(jié)點進(jìn)程判斷所述最新鎖版本是否高于所述專有鎖版本。
在本實施例中,節(jié)點進(jìn)程在實時接收到包含最新鎖版本的數(shù)據(jù)后,首先會根據(jù)所述節(jié)點進(jìn)程實時接收的訂閱數(shù)據(jù),判斷與所述節(jié)點進(jìn)程訂閱的數(shù)據(jù)對應(yīng)的所述數(shù)據(jù)文件是否存在;
若不存在,則新建存儲相應(yīng)最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件,繼而執(zhí)行所述根據(jù)所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成的所述節(jié)點進(jìn)程的專有鎖版本,所述節(jié)點進(jìn)程判斷所述最新鎖版本是否高于所述專有鎖版本的步驟;
若存在,則執(zhí)行所述根據(jù)所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成的所述節(jié)點進(jìn)程的專有鎖版本,所述節(jié)點進(jìn)程判斷所述最新鎖版本是否高于所述專有鎖版本的步驟。
其中,在上述新建存儲相應(yīng)最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件時,會將預(yù)先生成的本節(jié)點進(jìn)程專有鎖版本作為最新鎖版本,并將該最新鎖版本數(shù)據(jù)寫入該數(shù)據(jù)文件中。
上述預(yù)先生成的各所述節(jié)點進(jìn)程專有鎖版本,具體包括:
分布式系統(tǒng)在生成所述節(jié)點進(jìn)程的同時,根據(jù)所述節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的全局狀態(tài)變量,生成所述節(jié)點進(jìn)程專有的用于標(biāo)識 各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本;所述全局狀態(tài)變量用于記錄所述分布式鎖的最新鎖版本的值;和/或,
分布式系統(tǒng)在已持有分布式鎖的所述節(jié)點進(jìn)程重啟時,保留所述節(jié)點進(jìn)程重啟前所專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本。
其中,上述根據(jù)所述節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的全局狀態(tài)變量,生成所述節(jié)點進(jìn)程專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本,具體執(zhí)行的步驟包括:
102-1-1:分布式系統(tǒng)在生成所述節(jié)點進(jìn)程的同時,或在已持有分布式鎖的所述節(jié)點進(jìn)程重啟的同時,讀取所述節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的全局狀態(tài)變量。
102-1-2:判斷所述分布式鎖的全局狀態(tài)變量是否存在;
102-1-3:若所述全局狀態(tài)變量不存在,則生成和初始化所述全局狀態(tài)變量,并進(jìn)入下一步,若所述全局狀態(tài)變量存在,則將所述全局狀態(tài)變量的值自增1,并進(jìn)入下一步。
其中,所述生成和初始化所述全局狀態(tài)變量,具體步驟包括:
102-1-3-1:生成所述全局狀態(tài)變量。
102-1-3-2:以所述分布式系統(tǒng)的當(dāng)前時間戳作為初始值,初始化所述全局狀態(tài)變量。
102-1-4:以所述全局狀態(tài)變量的值為鎖版本的值,生成所述節(jié)點進(jìn)程專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本。
在本實施例中,時間戳以64位整數(shù)的格式記錄,相應(yīng)的,所述全局狀態(tài)變量的值也是64位整數(shù)的格式,繼而生成的鎖版本的值也是64位整數(shù)的格式。且,每新生成一個鎖版本,在原先記錄的全局狀態(tài)變量的值上加1。由此對每個分布式鎖而言,分布式系統(tǒng)每生成一個新的進(jìn)程或重啟一個新的進(jìn)程時,這些進(jìn)程在需要獲取相應(yīng)的分布式鎖時,分布式系統(tǒng)會分別對應(yīng)各自待獲取的分布式鎖生成一系列遞增的值為64位整數(shù)的鎖版本,例如生成對應(yīng)某個分布式鎖的從0、1、2開始遞增的一組鎖版本。
另外,在本實施例中,所述全局狀態(tài)變量保存在分布式系統(tǒng)負(fù)責(zé)調(diào)度管理的組件中,所述節(jié)點進(jìn)程的生成和重啟也由該負(fù)責(zé)調(diào)度管理的組件實施。
在本實施例中,各所述節(jié)點進(jìn)程分別判斷本節(jié)點進(jìn)程實時接收的所述最新鎖版本是否高于本節(jié)點進(jìn)程的所述專有鎖版本,具體步驟是:
102-2-1:判斷所述節(jié)點進(jìn)程實時接收的所述最新鎖版本的值是否大于所述節(jié)點進(jìn)程的所述專有鎖版本的值;
102-2-2:若大于,則表示所述最新鎖版本高于所述專有鎖版本;
102-2-3:若不大于,則表示所述最新鎖版本不高于所述專有鎖版本。
步驟103:所述節(jié)點進(jìn)程根據(jù)本節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài),以及所述是否高于的判斷結(jié)果,進(jìn)行釋放、獲取或等待所述分布式鎖的相應(yīng)處理。
所述相應(yīng)處理包括:
103-1:若所述節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài)為已持有所述分布式鎖,則執(zhí)行以下步驟:
103-1-1:若所述是否高于的判斷結(jié)果為是,則所述節(jié)點進(jìn)程釋放其持有的所述分布式鎖。
此時,由于已持有分布式鎖的節(jié)點進(jìn)程會實時接收到包含最新鎖版本的數(shù)據(jù),且新的節(jié)點進(jìn)程在啟動的時候會立即將更高的鎖版本更新入相應(yīng)的存儲最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件。這時候,已持有分布式鎖的節(jié)點進(jìn)程由于訂閱了相應(yīng)的數(shù)據(jù)文件中的數(shù)據(jù),會迅速察覺到有更高鎖版本的其它節(jié)點進(jìn)程出現(xiàn),進(jìn)而主動執(zhí)行退出服務(wù)的命令,并快速的釋放其已持有的分布式鎖,從而使需要獲取分布式鎖的有更高鎖版本的其它節(jié)點進(jìn)程獲取分布式鎖。
103-1-2:若所述是否高于的判斷結(jié)果為否,則所述節(jié)點進(jìn)程繼續(xù)持有所述分布式鎖,并以所述節(jié)點進(jìn)程的所述專有鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù)。
此時,已持有分布式鎖的節(jié)點進(jìn)程認(rèn)為本節(jié)點進(jìn)程的鎖版本是最高的,因此本節(jié)點進(jìn)程將繼續(xù)持有分布式鎖,并繼續(xù)提供服務(wù)。同時,在本實施例中,本節(jié)點進(jìn)程會將本節(jié)點進(jìn)程的專有鎖版本作為當(dāng)前最新鎖版本,并將該專有鎖版本寫入并覆蓋本節(jié)點進(jìn)程所訂閱的數(shù)據(jù)文件中的相應(yīng)數(shù)據(jù),以更新最新鎖版本數(shù)據(jù)。
需要說明的是,在步驟201所述訂閱的具體說明中,所述節(jié)點進(jìn)程能夠?qū)εc之對應(yīng)的所述當(dāng)前最新鎖版本數(shù)據(jù)發(fā)起寫操作,除了步驟103-1所述的以所述 節(jié)點進(jìn)程的所述專有鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù)外,還包括當(dāng)存儲最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件內(nèi)容被寫壞時,則當(dāng)前已持有分布式鎖的節(jié)點進(jìn)程會收到相應(yīng)數(shù)據(jù)文件發(fā)送的響應(yīng),然后把本節(jié)點進(jìn)程的專有鎖版本寫入并覆蓋該數(shù)據(jù)文件的相應(yīng)數(shù)據(jù)。
另外,在執(zhí)行本步驟時,若所述節(jié)點進(jìn)程持有所述分布式鎖,且繼續(xù)持有所述分布式鎖直至所述節(jié)點進(jìn)程完成該節(jié)點進(jìn)程被分配的所有服務(wù)后,執(zhí)行以下步驟:
所述分布式系統(tǒng)刪除與所述分布式鎖相對應(yīng)的所述最新鎖版本數(shù)據(jù)。
在本實施例中,在刪除上述最新鎖版本數(shù)據(jù)的同時,還應(yīng)當(dāng)刪除與該最新鎖版本數(shù)據(jù)相關(guān)的其它變量,例如相應(yīng)的上述用于生成鎖版本的全局狀態(tài)變量。從而在所述節(jié)點進(jìn)程所提供的服務(wù)全部執(zhí)行完后,或待訪問的共享資源使用完后,刪除掉相應(yīng)的分布式鎖,并釋放掉相應(yīng)的分布式鎖所占用的系統(tǒng)資源。
103-2:若所述節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài)為待獲取所述分布式鎖,則執(zhí)行以下步驟:
103-2-1:若所述是否高于的判斷結(jié)果為是,則所述節(jié)點進(jìn)程在等鎖隊列中等待。
此時,待獲取分布式鎖的節(jié)點進(jìn)程認(rèn)為本節(jié)點進(jìn)程的鎖版本不是最高的,因此本節(jié)點進(jìn)程將在等鎖隊列中等待,直到本節(jié)點進(jìn)程的鎖版本成為最高的。
103-2-2:若所述是否高于的判斷結(jié)果為否,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理,并以所述節(jié)點進(jìn)程的所述專有鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù)。
此時,所述節(jié)點進(jìn)程認(rèn)為本節(jié)點進(jìn)程的專有鎖版本是最高的鎖版本,因此本節(jié)點進(jìn)程便會進(jìn)行獲取所述分布式鎖的相應(yīng)處理,即基于傳統(tǒng)分布式鎖獲取機(jī)制,進(jìn)行獲取所述分布式鎖的一系列處理,進(jìn)而提供服務(wù)。同時,本節(jié)點進(jìn)程會將本節(jié)點進(jìn)程的專有鎖版本作為當(dāng)前最新鎖版本,并將該專有鎖版本寫入并覆蓋本節(jié)點進(jìn)程所訂閱的數(shù)據(jù)文件中的相應(yīng)數(shù)據(jù),以更新最新鎖版本數(shù)據(jù)。
對于步驟103-2,若存在多個待獲取所述分布式鎖的節(jié)點進(jìn)程同時發(fā)起獲取同一個分布式鎖的請求,則各節(jié)點進(jìn)程在發(fā)起請求時,都會訂閱與所述分布式鎖對應(yīng)的存儲有最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件,且任何一個節(jié)點進(jìn)程經(jīng)過判斷各自的專有鎖版本是否高于當(dāng)前最新鎖版本后,若更新存儲最新鎖版本數(shù)據(jù)的數(shù) 據(jù)文件時,其余的各節(jié)點進(jìn)程都會收到被更新的最新鎖版本數(shù)據(jù),從而再次判斷各自的專有鎖版本是否高于當(dāng)前最新鎖版本。最終,經(jīng)過多次這樣的判斷,只有一個節(jié)點進(jìn)程成為當(dāng)前有最高鎖版本的節(jié)點進(jìn)程,進(jìn)而該節(jié)點進(jìn)程獲取到相應(yīng)的分布式鎖。
綜上所述,在某些希望分布式系統(tǒng)中已持有分布式鎖的節(jié)點進(jìn)程重啟后,能夠重新獲取該分布式鎖的場景下,或在某些希望分布式系統(tǒng)中已持有分布式鎖的節(jié)點進(jìn)程快速釋放其持有的分布式鎖,從而使新的節(jié)點進(jìn)程獲取該分布式鎖的場景下,本實施例的方法能夠使重啟后的節(jié)點進(jìn)程或新生成的節(jié)點進(jìn)程獲取更高的鎖版本,從而使重啟后的節(jié)點進(jìn)程或新生成的節(jié)點進(jìn)程以更高的優(yōu)先級快速獲取分布式鎖,繼而由重啟后的節(jié)點進(jìn)程或新生成的節(jié)點進(jìn)程提供相應(yīng)的服務(wù)。
在上述的實施例中,提供了一種分布式鎖服務(wù)方法,本申請還提供一種分布式鎖獲取方法。請參看圖3,其為本申請第二實施例提供的分布式鎖獲取方法的流程示意圖。所述方法包括如下步驟:
步驟301:分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程,發(fā)起獲取與本節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的請求。
步驟302:根據(jù)所述請求中關(guān)于待獲取的所述分布式鎖的相關(guān)信息,實時接收當(dāng)前存儲的與所述分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù);所述鎖版本的高低用于標(biāo)識各所述節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的高低。
在本實施例中,所述最新鎖版本數(shù)據(jù)具體是以數(shù)據(jù)文件的形式被存儲記錄。相應(yīng)的,所述根據(jù)所述請求中關(guān)于待獲取的所述分布式鎖的相關(guān)信息,實時接收當(dāng)前存儲的與所述分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù),是通過訂閱上述數(shù)據(jù)文件的方式進(jìn)行的。圖4為第二實施例中實時接收包含最新鎖版本的數(shù)據(jù)的步驟的具體實施方式的流程圖。具體步驟包括:
步驟401:所述節(jié)點進(jìn)程訂閱所述數(shù)據(jù)文件的相應(yīng)數(shù)據(jù);所述訂閱,是指用于關(guān)聯(lián)所述節(jié)點進(jìn)程與所述數(shù)據(jù)文件中與該節(jié)點進(jìn)程對應(yīng)的所述最新鎖版本數(shù)據(jù),即通過訂閱,所述節(jié)點進(jìn)程能夠?qū)εc之對應(yīng)的所述最新鎖版本數(shù)據(jù)發(fā)起寫操作,且當(dāng)與之對應(yīng)的所述最新鎖版本數(shù)據(jù)發(fā)生更新時,所述節(jié)點進(jìn)程能夠?qū)崟r得到更新后的所述最新鎖版本數(shù)據(jù)。
步驟402:所述節(jié)點進(jìn)程實時接收其訂閱的所述數(shù)據(jù)文件中的數(shù)據(jù),即實時 接收當(dāng)前存儲的與所述分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù)。
通常在分布式系統(tǒng)中,分布式鎖由系統(tǒng)中的提供分布式鎖服務(wù)的組件管理和提供,在本申請中,存儲最新鎖版本數(shù)據(jù)的文件也由單獨的組件管理。對于本實施例,與各個分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù)分別以單獨的數(shù)據(jù)文件的形式被存儲記錄,即存儲所述最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件與所述分布式鎖一一對應(yīng)。這些數(shù)據(jù)文件由版本數(shù)據(jù)文件組件統(tǒng)一管理,例如數(shù)據(jù)文件的新建、更新和刪除操作都需要通過版本數(shù)據(jù)文件組件完成,且各數(shù)據(jù)文件和各節(jié)點進(jìn)程間的數(shù)據(jù)傳輸也通過版本數(shù)據(jù)文件組件完成。
步驟303:根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本。
在本實施例中,節(jié)點進(jìn)程在實時接收到包含最新鎖版本的數(shù)據(jù)后,首先會根據(jù)所述節(jié)點進(jìn)程實時獲取的訂閱數(shù)據(jù),判斷所述節(jié)點進(jìn)程訂閱的數(shù)據(jù)對應(yīng)的所述數(shù)據(jù)文件是否存在;
若不存在,則新建存儲相應(yīng)最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件,繼而執(zhí)行所述根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本的步驟;
若存在,則執(zhí)行所述根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本的步驟。
其中,在上述新建存儲相應(yīng)最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件時,會將預(yù)先生成的本節(jié)點進(jìn)程專有鎖版本作為最新鎖版本,并將該最新鎖版本數(shù)據(jù)寫入該數(shù)據(jù)文件中。
上述預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,具體包括:
分布式系統(tǒng)在生成所述節(jié)點進(jìn)程的同時,根據(jù)所述節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的全局狀態(tài)變量,生成所述節(jié)點進(jìn)程專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本;所述全局狀態(tài)變量用于記錄所述分布式鎖的最新鎖版本的值;和/或,
分布式系統(tǒng)在已持有分布式鎖的所述節(jié)點進(jìn)程重啟時,保留所述節(jié)點進(jìn)程重啟前所專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本。
其中,上述根據(jù)所述節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的全局狀態(tài)變量,生成所述節(jié)點進(jìn)程專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本,具體執(zhí)行的步驟包括:
303-1-1:分布式系統(tǒng)在生成所述節(jié)點進(jìn)程的同時,或在已持有分布式鎖的所述節(jié)點進(jìn)程重啟的同時,讀取所述節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的全局狀態(tài)變量。
303-1-2:判斷所述分布式鎖的全局狀態(tài)變量是否存在。
303-1-3:若所述全局狀態(tài)變量不存在,則生成和初始化所述全局狀態(tài)變量,并進(jìn)入下一步,若所述全局狀態(tài)變量存在,則將所述全局狀態(tài)變量的值自增1,并進(jìn)入下一步。
其中,所述生成和初始化所述全局狀態(tài)變量,具體包括:
303-1-3-1:生成所述全局狀態(tài)變量;
303-1-3-2:以所述分布式系統(tǒng)的當(dāng)前時間戳作為初始值,初始化所述全局狀態(tài)變量。
303-1-4:以所述全局狀態(tài)變量的值為鎖版本的值,生成所述節(jié)點進(jìn)程專有的用于標(biāo)識各節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的鎖版本。
與本申請第一實施例相同,在本實施例中,生成的是分布對應(yīng)各個分布式鎖的從0、1、2開始遞增的值為64位整數(shù)的一系列鎖版本。
在本實施例中,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本的具體步驟是:
303-1:判斷所述節(jié)點進(jìn)程實時接收的所述最新鎖版本的值是否大于所述節(jié)點進(jìn)程的所述專有的鎖版本的值。
303-2:若大于,則表示所述最新鎖版本高于所述專有鎖版本。
303-3:若不大于,則表示所述最新鎖版本不高于所述專有鎖版本。
步驟304:若步驟303的判斷結(jié)果為是,則將所述節(jié)點進(jìn)程加入等鎖隊列中等待;若步驟303的判斷結(jié)果為否,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的 相應(yīng)處理。
下面對所述的所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理進(jìn)行具體說明。
圖5為第二實施例中所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理的步驟的具體實施方式的流程圖。所述相應(yīng)處理的步驟包括:
步驟501:所述節(jié)點進(jìn)程將所述節(jié)點進(jìn)程的所述專有鎖版本作為當(dāng)前的最新鎖版本,并以該當(dāng)前的最新鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù)。
在本實施例中,具體是指將所述的所述節(jié)點進(jìn)程的所述專有鎖版本作為當(dāng)前的最新鎖版本,并以該當(dāng)前的最新鎖版本為依據(jù)更新所述數(shù)據(jù)文件中的相應(yīng)最新鎖版本數(shù)據(jù)。
步驟502:所述分布式系統(tǒng)將更新后的所述最新鎖版本數(shù)據(jù)推送給當(dāng)前已持有所述分布式鎖的或其它等待獲取所述分布式鎖的各節(jié)點進(jìn)程。
在本實施例中,具體是指當(dāng)存儲有所述最新鎖版本數(shù)據(jù)的所述數(shù)據(jù)文件發(fā)生更新時,所述分布式系統(tǒng)將更新后的所述最新鎖版本數(shù)據(jù)推送給當(dāng)前已持有所述分布式鎖的或其它等待獲取所述分布式鎖的各節(jié)點進(jìn)程,即訂閱所述數(shù)據(jù)文件的各節(jié)點進(jìn)程能夠?qū)崟r得到更新后的所述當(dāng)前最新鎖版本數(shù)據(jù)。
步驟503:基于傳統(tǒng)分布式鎖獲取機(jī)制,所述節(jié)點進(jìn)程嘗試獲取所述分布式鎖,進(jìn)而提供服務(wù)。
在本實施例中,對于步驟503,若所述節(jié)點進(jìn)程成功獲取所述分布式鎖,且將其提供的所有服務(wù)執(zhí)行完畢后,所述分布式系統(tǒng)會刪除與所述分布式鎖相對應(yīng)的所述最新鎖版本數(shù)據(jù)。
另外對于當(dāng)前存在多個等待獲取所述分布式鎖的節(jié)點進(jìn)程的場景,即在執(zhí)行完步驟5-2后,所述最新鎖版本數(shù)據(jù)被推送給所述的其它等待獲取所述分布式鎖的多個節(jié)點進(jìn)程,則該些等待獲取所述分布式鎖的各節(jié)點進(jìn)程依次執(zhí)行權(quán)利要求10中所述的以下步驟:
1、根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本;
2、若判斷結(jié)果為是,則將所述節(jié)點進(jìn)程加入等鎖隊列中等待;
3、若判斷結(jié)果為否,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理。
由于存儲最新鎖版本數(shù)據(jù)的數(shù)據(jù)文件每更新一次,都會將更新后的最新鎖版本數(shù)據(jù)發(fā)送給訂閱該文件中相應(yīng)數(shù)據(jù)的節(jié)點進(jìn)程,因此等待獲取所述分布式鎖的各節(jié)點進(jìn)程會經(jīng)過多次上述的判斷步驟,最終只有一個節(jié)點進(jìn)程成為當(dāng)前有最高鎖版本的節(jié)點進(jìn)程,進(jìn)而該節(jié)點進(jìn)程獲取到相應(yīng)的分布式鎖。
在上述的實施例中,提供了一種分布式鎖服務(wù)方法,與之相對應(yīng)的,本申請還提供一種分布式鎖服務(wù)裝置。請參看圖6,其為本申請第三實施例提供的分布式鎖服務(wù)裝置的流程示意圖。由于裝置實施例基本相似于方法實施例,所以描述的比較簡單,相關(guān)之處參見方法實施例的部分說明即可。下述描述的裝置實施例僅僅是示意性的。
本實施例的一種分布式鎖服務(wù)裝置,包括:最新鎖版本數(shù)據(jù)接收單元601、鎖版本判斷單元602和分布式鎖處理單元603。
所述最新鎖版本數(shù)據(jù)接收單元601,用于分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程或當(dāng)前已持有分布式鎖的節(jié)點進(jìn)程,實時接收包含與本節(jié)點進(jìn)程待獲取的或已持有的所述分布式鎖相對應(yīng)的最新鎖版本的數(shù)據(jù);所述鎖版本的高低用于標(biāo)識各所述節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的高低;
所述鎖版本判斷單元602,用于根據(jù)所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成的所述節(jié)點進(jìn)程的專有鎖版本,所述節(jié)點進(jìn)程判斷所述最新鎖版本是否高于所述專有鎖版本;
所述分布式鎖處理單元603,用于所述節(jié)點進(jìn)程根據(jù)本節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài),以及所述是否高于的判斷結(jié)果,進(jìn)行釋放、獲取或等待所述分布式鎖的相應(yīng)處理。
所述分布式鎖處理單元603,包括分布式鎖第一處理子單元603-1、分布式鎖第二處理子單元603-2、分布式鎖第三處理子單元603-3和分布式鎖第四處理子單元603-4。
所述分布式鎖第一處理子單元603-1,用于若判斷所述節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài)為已持有所述分布式鎖,且所述是否高于的判斷結(jié)果為是時,則所述節(jié)點進(jìn)程釋放其持有的所述分布式鎖;
所述分布式鎖第二處理子單元603-2,用于若判斷所述節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài)為已持有所述分布式鎖,且所述是否高于的判斷結(jié)果為否時,則所述節(jié)點進(jìn)程繼續(xù)持有所述分布式鎖,并以所述節(jié)點進(jìn)程的所述專有鎖 版本為依據(jù)更新所述最新鎖版本數(shù)據(jù);
所述分布式鎖第三處理子單元603-3,用于若判斷所述節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài)為待獲取所述分布式鎖,且所述是否高于的判斷結(jié)果為是時,則所述節(jié)點進(jìn)程在等鎖隊列中等待;
所述分布式鎖第四處理子單元603-4,用于若判斷所述節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài)為待獲取所述分布式鎖,且所述是否高于的判斷結(jié)果為否時,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理,并以所述節(jié)點進(jìn)程的所述專有鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù)。
在上述的實施例中,提供了一種分布式鎖獲取方法,與之相對應(yīng)的,本申請還提供一種分布式鎖獲取裝置。請參看圖7,其為本申請第四實施例提供的分布式鎖獲取裝置的流程示意圖。由于裝置實施例基本相似于方法實施例,所以描述的比較簡單,相關(guān)之處參見方法實施例的部分說明即可。下述描述的裝置實施例僅僅是示意性的。
本實施例的一種分布式鎖獲取裝置,包括:請求單元701、最新鎖版本數(shù)據(jù)接收單元702、分布式鎖判斷單元703和分布式鎖處理單元704。
請求單元701,用于分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程,發(fā)起獲取與本節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的請求;
最新鎖版本數(shù)據(jù)接收單元702,用于根據(jù)所述請求中關(guān)于待獲取的所述分布式鎖的相關(guān)信息,實時接收當(dāng)前存儲的與所述分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù);所述鎖版本的高低用于標(biāo)識各所述節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的高低;所述全局狀態(tài)變量用于記錄所述分布式鎖的最新鎖版本的值。
分布式鎖判斷單元703,用于根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本。
分布式鎖處理單元704,用于若在分布式鎖判斷單元中的判斷結(jié)果為是,則將所述節(jié)點進(jìn)程加入等鎖隊列中等待;若在分布式鎖判斷單元中的判斷結(jié)果為否,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理。
在所述分布式鎖處理單元704中,所述若在分布式鎖判斷單元中的判斷結(jié)果為否,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理,包括:
若判斷結(jié)果為否,則所述節(jié)點進(jìn)程將所述節(jié)點進(jìn)程的所述專有鎖版本作為 當(dāng)前的最新鎖版本,并以該當(dāng)前的最新鎖版本為依據(jù)更新所述最新鎖版本數(shù)據(jù);
所述分布式系統(tǒng)將更新后的所述最新鎖版本數(shù)據(jù)推送給當(dāng)前已持有所述分布式鎖的或其它等待獲取所述分布式鎖的各節(jié)點進(jìn)程;
基于傳統(tǒng)分布式鎖獲取機(jī)制,所述節(jié)點進(jìn)程嘗試獲取所述分布式鎖,進(jìn)而提供服務(wù)。
在上述的實施例中,分別提供了一種分布式鎖服務(wù)方法、獲取方法,以及相應(yīng)的裝置,與之相對應(yīng)的,本申請還提供一種分布式鎖服務(wù)系統(tǒng)。請參看圖8,其為本申請第五實施例提供的分布式鎖服務(wù)系統(tǒng)的流程示意圖。由于系統(tǒng)實施例中系統(tǒng)是基于裝置實施例中的裝置進(jìn)行部署的,所以描述的比較簡單,相關(guān)之處參見裝置和方法實施例的部分說明即可。下述描述的系統(tǒng)實施例僅僅是示意性的。
所述分布式鎖服務(wù)系統(tǒng)包括資源調(diào)度器、分布式鎖提供組件、鎖版本數(shù)據(jù)文件組件、分布式系統(tǒng)中的各節(jié)點進(jìn)程,以及各節(jié)點進(jìn)程管理的任務(wù)和作業(yè)。所述節(jié)點進(jìn)程用于管理分布式系統(tǒng)中的任務(wù)或作業(yè),當(dāng)所述系統(tǒng)啟動新的節(jié)點進(jìn)程接替原節(jié)點進(jìn)程提供相同的服務(wù),進(jìn)而接替原節(jié)點進(jìn)程管理分布式系統(tǒng)中的任務(wù)或作業(yè)時,各所述節(jié)點進(jìn)程所應(yīng)用的分布式鎖服務(wù),以便獲取或釋放所述分布式鎖時,采用權(quán)利要求1至22中任一所述的分布式鎖服務(wù)方法或分布式鎖獲取方法,從而停止或提供相應(yīng)服務(wù)。
上述分別提供了一種分布式鎖服務(wù)、獲取方法及相應(yīng)裝置和系統(tǒng)的實施例,相應(yīng)的,本申請還提供一種電子設(shè)備,該電子設(shè)備包括:
顯示器;
處理器;以及
存儲器,所述存儲器被配置成存儲分布式鎖服務(wù)裝置,和/或,分布式鎖獲取裝置,
所述分布式鎖服務(wù)裝置被所述處理器執(zhí)行時,執(zhí)行如下步驟:
分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程或當(dāng)前已持有分布式鎖的節(jié)點進(jìn)程,實時接收包含與本節(jié)點進(jìn)程待獲取的或已持有的所述分布式鎖相對應(yīng)的最新鎖版本的數(shù)據(jù);所述鎖版本的高低用于標(biāo)識各所述節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的高低;
根據(jù)所述節(jié)點進(jìn)程實時接收的包含所述最新鎖版本的數(shù)據(jù),以及預(yù)先生成 的所述節(jié)點進(jìn)程的專有鎖版本,所述節(jié)點進(jìn)程判斷所述最新鎖版本是否高于所述專有鎖版本;
所述節(jié)點進(jìn)程根據(jù)本節(jié)點進(jìn)程當(dāng)前對所述分布式鎖的獲取狀態(tài),以及所述是否高于的判斷結(jié)果,進(jìn)行釋放、獲取或等待所述分布式鎖的相應(yīng)處理;
所述分布式鎖獲取裝置被所述處理器執(zhí)行時,執(zhí)行如下步驟:
分布式系統(tǒng)中待獲取分布式鎖的節(jié)點進(jìn)程,發(fā)起獲取與本節(jié)點進(jìn)程待提供的服務(wù)所需資源對應(yīng)的分布式鎖的請求;
根據(jù)所述請求中關(guān)于待獲取的所述分布式鎖的相關(guān)信息,實時接收當(dāng)前存儲的與所述分布式鎖對應(yīng)的最新鎖版本數(shù)據(jù);所述鎖版本的高低用于標(biāo)識各所述節(jié)點進(jìn)程向同一個分布式鎖發(fā)起獲取請求的優(yōu)先級的高低;
根據(jù)實時接收的所述最新鎖版本數(shù)據(jù),以及預(yù)先生成的關(guān)于所述分布式鎖的所述節(jié)點進(jìn)程的專有鎖版本,判斷所述最新鎖版本是否高于所述節(jié)點進(jìn)程的專有鎖版本;
若判斷結(jié)果為是,則將所述節(jié)點進(jìn)程加入等鎖隊列中等待;
若判斷結(jié)果為否,則所述節(jié)點進(jìn)程進(jìn)行獲取所述分布式鎖的相應(yīng)處理。
本申請雖然以較佳實施例公開如上,但其并不是用來限定本申請,任何本領(lǐng)域技術(shù)人員在不脫離本申請的精神和范圍內(nèi),都可以做出可能的變動和修改,因此本申請的保護(hù)范圍應(yīng)當(dāng)以本申請權(quán)利要求所界定的范圍為準(zhǔn)。
在一個典型的配置中,計算設(shè)備包括一個或多個處理器(CPU)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。
內(nèi)存可能包括計算機(jī)可讀介質(zhì)中的非永久性存儲器,隨機(jī)存取存儲器(RAM)和/或非易失性內(nèi)存等形式,如只讀存儲器(ROM)或閃存(flash RAM)。內(nèi)存是計算機(jī)可讀介質(zhì)的示例。
1、計算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實現(xiàn)信息存儲。信息可以是計算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計算機(jī)的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(PRAM)、靜態(tài)隨機(jī)存取存儲器(SRAM)、動態(tài)隨機(jī)存取存儲器(DRAM)、其他類型的隨機(jī)存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲器(CD-ROM)、數(shù)字多功能光盤(DVD)或其他光學(xué)存儲、磁盒式磁帶,磁帶磁磁 盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計算設(shè)備訪問的信息。按照本文中的界定,計算機(jī)可讀介質(zhì)不包括非暫存電腦可讀媒體(transitory media),如調(diào)制的數(shù)據(jù)信號和載波。
2、本領(lǐng)域技術(shù)人員應(yīng)明白,本申請的實施例可提供為方法、系統(tǒng)或計算機(jī)程序產(chǎn)品。因此,本申請可采用完全硬件實施例、完全軟件實施例或結(jié)合軟件和硬件方面的實施例的形式。而且,本申請可采用在一個或多個其中包含有計算機(jī)可用程序代碼的計算機(jī)可用存儲介質(zhì)(包括但不限于磁盤存儲器、CD-ROM、光學(xué)存儲器等)上實施的計算機(jī)程序產(chǎn)品的形式。