何為看門狗
看門狗機制的主要作用是自動續期鎖,確保在節點完成任務之前,鎖不會過期。具體來說,當一個節點獲取到鎖后,看門狗會定期檢查該鎖的過期時間,并在必要時延長鎖的過期時間,確保節點可以順利完成任務。
步驟
- 在獲取鎖的時候,不能指定leaseTime或者只能將leaseTime設置為-1,這樣才能開啟看門狗機制。
- 在tryLockInnerAsync方法里嘗試獲取鎖,如果獲取鎖成功調用scheduleExpirationRenewal執行看門狗機制
- 在scheduleExpirationRenewal中比較重要的方法就是renewExpiration,當線程第一次獲取到鎖(也就是不是重入的情況),那么就會調用renewExpiration方法開啟看門狗機制。
- 在renewExpiration會為當前鎖添加一個延遲任務task,這個延遲任務會在10s后執行,執行的任務就是將鎖的有效期刷新為30s(這是看門狗機制的默認鎖釋放時間)
- 并且在任務最后還會繼續遞歸調用renewExpiration。
首先獲取到鎖(這個鎖30s后自動釋放),然后對鎖設置一個延遲任務(10s后執行),延遲任務給鎖的釋放時間刷新為30s,并且還為鎖再設置一個相同的延遲任務(10s后執行),這樣就達到了如果一直不釋放鎖(程序沒有執行完)的話,看門狗機制會每10s將鎖的自動釋放時間刷新為30s。
startWatchdog方法啟動了一個定時任務,每隔10秒檢查一次當前持有的鎖,并調用checkAndExtendLocks方法延長鎖的過期時間。extendLeaseTime方法通過執行Redis腳本來更新鎖的過期時間,確保鎖在任務完成之前不會過期。
看門狗機制的優缺點
優點:
自動續期:看門狗機制可以自動續期鎖,確保任務在完成之前鎖不會過期。
可靠性高:通過定期檢查鎖的狀態,看門狗機制可以確保鎖的持有狀態,從而提高系統的可靠性。
缺點:
資源消耗:看門狗機制需要后臺線程定期檢查鎖的狀態,這會消耗一定的系統資源。
復雜性增加:看門狗機制的引入增加了系統的復雜性,可能需要額外的調試和維護工作。
優化
合理設置檢查頻率:根據任務的執行時間和系統的負載情況,合理設置看門狗線程的檢查頻率,既保證鎖的持有狀態,又減少系統資源的消耗。 優化Redis腳本:使用高效的Redis腳本來更新鎖的過期時間,減少Redis服務器的負載。 監控和報警:建立完善的監控和報警機制,及時發現和處理看門狗機制中的異常情況,確保系統的穩定性。