在日常開發中除了給前端開發介面,還要寫一些定時處理任務,比如乙個活動需要每天定時給所有使用者派發獎勵。乙個成熟服務框架需要乙個全域性的定時任務排程中心,通過定時任務排程中心可以檢視服務有哪些定時任務以及定時任務的執**況,對於執行失敗的定時任務可以手動執行等。
我們公司的微服務架構沒有定時任務排程中心,每個服務通過類似crontab
定時任務配置來管理自身的定時任務,為了保證每個服務高可用,我們給每個服務都部署了兩個節點,對於一些不能併發執行的定時任務我們往往需要給定時任務加乙個分布式鎖,有時甚至需要修改服務的crontab
定時任務配置,保證一組服務只乙個服務能執行定時任務,對於定時任務執**況沒有乙個統一地方可以檢視,需要檢視每個服務日誌才能確認定時任務是否執行成功,對於執行失敗的定時任務需要寫額外的重做**。所以我們需要乙個定時任務排程中心來管理每個服務的定時任務,這個定時任務排程中心需要有以下功能:
可以檢視服務有哪些定時任務以及任務的執行狀態。
對於執行失敗的定時任務可以在管理介面手動發起重做。
每個定時任務都抽象成介面,由定時任務排程中心負責排程。
定時任務什麼時候執行應由具體業務服務配置,定時任務排程中心可獲取這些配置進行定時排程。
既然決定開發乙個定時任務排程中心,那麼問題來了,我們是否需要開發乙個新的服務?我的答案是不需要,我們把定時任務當作服務介面,我們所有服務的介面資訊都登記到服務註冊中心,我們可以給介面新增乙個定時任務標籤,註冊中心將打上定時任務標籤的服務介面放到乙個定時任務執行佇列中,由定時任務執行佇列管理每個服務定時任務介面的排程,同時將各個服務的定時任務介面與執**況記錄到資料庫中,然後在註冊中心新增乙個定時任務管理頁面來管理各個服務的定時任務。
定時任務排程中心的大致思路有了,剩下的過程就是將實現思路具體化。我們現有的定時任務配置與crontab
類似,可以按分鐘、小時、日期、月份、星期等幾個維度進行配置,如果定時任務排程中心全部實現這幾個維度的配置,會導致定時任務配置解析與排程邏輯變得複雜,乙個框架因為簡單才更加穩定可靠,我決定對定時任務配置維度進行簡化處理,最終抽象出以下兩類定時任務:
每隔n秒執行一次的定時任務。
每天特定時間點執行的定時任務。
每個定時任務都可能執行多次,即每個定時任務可以有多條執行記錄,所以可以在定時任務管理頁面中檢視每個定時任務的執**況,但日常運維中我們不是很關心定時任務的歷史執**況,如果記錄定時任務每次的執**況,我們還要考慮如何管理歷史執行記錄以及歷史執行記錄太多了該如何處理,我不希望因為開發定時任務排程中心導致服務註冊中心過於臃腫(定時任務排程中心當作服務註冊中心的乙個子模組來開發),所以我決定我們的定時任務排程中心只記錄每個定時任務最近一次的執行記錄。
對於日常運營活動中的定時任務,在活動結束時這些定時任務的生命週期也結束,這就要求業務服務的定時任務可以自動解除安裝,我們約定當定時任務生命週期結束時業務服務的定時任務介面應該返回uninstall
錯誤碼,任務排程中心呼叫定時任務介面時如果介面返回uninstall
錯誤碼則將定時任務從任務呼叫佇列中移除。
根據以上思路,我們開發了乙個足夠簡單穩定的定時任務排程中心。首先我們針對兩種型別的定時任務新增以下兩個註解,介面類的註解資訊最終會上報的服務註冊中心。
@target(elementtype.type)
@retention(retentionpolicy.runtime)
public static @inte***ce timertask
@target(elementtype.type)
@retention(retentionpolicy.runtime)
public static @inte***ce dailytask
我們希望新增乙個名為sendprize
的定時任務,這個任務每天09:00:00執行一次,則我們只用給這個類新增dailytask
註解就可以了,相關**如下:
}定時任務排程中心的管理介面如下:
linux定時任務 at定時任務
at命令是一次性定時計畫任務,at的守護程序atd會以後臺模式執行,檢查作業佇列來執行作業。atd守護程序會檢查系統上的乙個特殊目錄來獲取at命令的提交的作業,預設情況下,atd守護程序每60秒檢查一次目錄,有作業時,會檢查作業執行時間,如果時間與當前時間匹配,則執行此作業。注意 at命令是一次性定...
定時任務配置
定時任務配置 0 0 12 每天中午12點觸發 0 15 10 每天上午10 15觸發 0 15 10 每天上午10 15觸發 0 15 10 每天上午10 15觸發 0 15 10 2005 2005年的每天上午10 15觸發 0 14 在每天下午2點到下午2 59期間的每1分鐘觸發 0 0 5 ...
at定時任務
at的守護程序每60秒檢查一次作業佇列,有作業時檢查作業,時間恰好達到,則執行作業。前提 保證atd程序已經啟動,檢查atd程序是否啟動 ps ef grep atd。atd的命令格式 at 選項 時間 ctrl d 結束at命令的輸入。選項 m 任務完成後給使用者傳送郵件,沒有標準輸出。i atg...