叢集多機部署時定時任務重複執行問題

摸鱼小天才發表於2024-11-26

業務場景:

系統中需要使用到定時任務,用了spring的註解@Schedule註解實現。本地無問題,因為是單機。實際部署時是叢集部署,有多個伺服器,會同時執行定時任務,導致資料重複處理。

解決方案:

方案一 定時任務分離

將系統的定時任務單獨抽離為一個專案,與業務後臺服務同步在另一個單獨的伺服器上部署。

方案二 透過ip控制

適用於已知每個伺服器的ip且ip不為動態ip,即ip不變。

方案三 利用資料庫加鎖

在資料庫中寫入一個變數,利用該變數控制每次只有一個伺服器例項能執行該定時任務。比如只有讀到變數為1時,才執行任務,並且讀到後立馬將變數置為0,用程式確保讀寫時都加鎖,讀寫成功後釋放鎖。

方案四 redis分散式鎖

redis分散式鎖的實現
關於redis分散式鎖,可以詳細看上面的技術文章。主要就是利用redis加鎖解鎖,從而保證多個例項每次只有一個能執行定時任務,算是方案三的升級版。如果redis也是叢集部署,上面的文章也提到了解決方案——redission。

方案五 分散式任務排程框架

關於分散式任務排程框架——定時任務部署在多臺伺服器時如何避免重複執行,該篇文章的解決方案有較為具體的描述。框架的底層也基於分散式鎖和資料庫來進行控制和排程。

相關文章