集群服務器定時任務,只運行一個定時器的設計


(1)只在一台服務器上部署該定時任務代碼。

(2)在定時任務代碼上加上某個特定的ip限制,僅某個ip的服務器能運行該定時任務。

(3)利用數據庫的共享鎖事務管理機制來運行定時任務。

   第一步:新建一張數據庫表,表有三個字段:status(表當前定時器是否處於可運行狀態)、timestamp(時間戳)、serverIP(正在運行定時器的服務器IP)。

   第二步:檢查是否有機器正在運行定時任務。檢查方法:update定時任務表的status字段為1(1為執行中,0為未執行)、ip為自己的ip,如果update失敗,則證明有機器在執行該定時任務,該機器的定時任務就不執行了,成功則進行第三步。

   第三步:執行定時任務的具體內容,結束還原excute字段為0。

另外:
  首先,我們先在數據庫建一個表:timerT,表里面有三個字段:status(表當前定時器是否處於可運行狀態)、timestamp(時間戳)、serverIP(正在運行定時器的服務器IP)。
      這里其具體的用法是:當兩台服務器,都運行起來后,服務器A開始執行定時器,這時,A會去讀取表timerT的status字段,當為0時,則執行定時器的業務邏輯,此時A定時器,需要把status改為1,以便讓另一台服務器的定時器B不去執行業務邏輯並把當前服務器的IP記錄到表中,同時修改啟動一個新的線程,在XXX長的時間間隔內不斷去修改timestamp的值,當A執行完業務邏輯時,就把status的值改為0,這樣B定時器就可以執行。
  這樣做可以解決一個問題,就是:當其中一個定時器A掛掉后,我們另一個定時器B,可以比對timestap的值與當前時間是否超過XXX時長,如果超過,則證明定時器A已經掛掉,這時B就會把status的值改成1,把serverIP改成B定時器所在的服務器IP,並執行業務邏輯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM