1. 程式人生 > >多程序任務熔斷處理

多程序任務熔斷處理

多程序任務熔斷處理

背景:程式開發中設定了一個定時任務,任務執行時會去操作資料庫。

問題:當部屬了多個相應的應用時(假設不同ip), 多個應用就相當於多個程序,若多個程序同時觸發定時任務,會造成資源浪費(同一件事情多個人幹)、不可估算的錯誤(多個人同時操作資料庫,比方說update)等問題

解決方案:

1. 建立一個多程序鎖表t_process_lock,記錄當前任務名name,應用服務的ip,更新時間updatetime(更新時間作為心跳依據)

自己ip
2. 當定時任務觸發時,檢查表t_process_lock是否存在該任務名name,若不存在,則插入name、ip、updatetime 表示此ip已佔用, 其他ip不允許訪問
3. 當定時任務觸發時,檢查表t_process_lock是否存在該任務名name,若存在,則檢查表ip和自己服務的ip是否一致,若一致則更新updatetime,並執行任務。


其他ip的處理
2. 當定時任務觸發時,檢查表t_process_lock是否存在該任務名name,若存在,則檢查表ip和自己服務的ip是否一致,若不一致,則獲取表資料的updatetime,跟資料庫的當前時間now 做減法。 得到一個心跳間隔時間ping。 假設定時任務是10分鐘進行一次,那麼若ping>15分鐘(因任務執行需要消耗時間,具體看程式耗時,本案例任務好耗時1分鐘,允許5分鐘降低誤差), 則可以認為表ip已經掛了(或者宕機)
3. 此時新ip可以插入name、ip、updatetime 表示新ip已佔用, 其他ip不允許訪問

 

ps: 若考慮到單程序多執行緒環境下, 只需要程式自己做熔斷處理就可以了。 提示: 搞一個靜態變數儲存在記憶體中,區別任務是否正在執行。