高并發(fā)環(huán)境下如何確保出庫(kù)腳本任務(wù)的唯一性并實(shí)時(shí)監(jiān)控其運(yùn)行狀態(tài)?本文針對(duì)集群環(huán)境下,多個(gè)用戶和服務(wù)器同時(shí)運(yùn)行同一出庫(kù)腳本任務(wù)的情況,提出一種解決方案,確保任務(wù)僅運(yùn)行一個(gè)實(shí)例并實(shí)時(shí)監(jiān)控其狀態(tài)。
背景:出庫(kù)任務(wù)由用戶觸發(fā),持續(xù)運(yùn)行;系統(tǒng)由兩臺(tái)后端服務(wù)器組成,使用redis進(jìn)行狀態(tài)管理。原方案使用redis鍵值對(duì)控制任務(wù)狀態(tài),存在線程中斷后需手動(dòng)重置參數(shù)才能重啟,且缺乏實(shí)時(shí)監(jiān)控。
改進(jìn)方案:采用Redisson分布式鎖機(jī)制保證任務(wù)唯一性。Redisson分布式鎖能夠有效防止集群環(huán)境下多個(gè)節(jié)點(diǎn)同時(shí)執(zhí)行同一任務(wù)。其自動(dòng)續(xù)期機(jī)制確保服務(wù)崩潰后鎖不會(huì)立即釋放,避免任務(wù)重復(fù)執(zhí)行。鎖存在表示任務(wù)運(yùn)行,鎖不存在表示任務(wù)停止。
實(shí)現(xiàn):每個(gè)后端服務(wù)啟動(dòng)時(shí)嘗試獲取Redisson分布式鎖。只有獲取到鎖的服務(wù)才能啟動(dòng)出庫(kù)腳本。鎖的獲取和釋放保證了集群中同一時(shí)刻最多只有一個(gè)實(shí)例運(yùn)行腳本。
狀態(tài)監(jiān)控:用戶可直接查詢Redis中Redisson分布式鎖是否存在來(lái)判斷腳本運(yùn)行狀態(tài)。鎖存在即任務(wù)運(yùn)行中,鎖不存在即任務(wù)停止。服務(wù)崩潰后鎖釋放存在短暫延遲,可通過(guò)調(diào)整鎖的過(guò)期時(shí)間來(lái)縮短延遲。
優(yōu)勢(shì):該方案保證了集群環(huán)境下腳本任務(wù)的唯一性,并提供便捷的運(yùn)行狀態(tài)監(jiān)控。服務(wù)啟動(dòng)時(shí)自動(dòng)嘗試獲取鎖,實(shí)現(xiàn)腳本任務(wù)的自動(dòng)啟動(dòng),有效解決了原方案的不足。 整個(gè)流程簡(jiǎn)潔可靠,高效穩(wěn)定。