乙個簡單的定時任務排程中心設計方案

2021-10-07 08:54:17 字數 2229 閱讀 7452

在日常開發中除了給前端開發介面,還要寫一些定時處理任務,比如乙個活動需要每天定時給所有使用者派發獎勵。乙個成熟服務框架需要乙個全域性的定時任務排程中心,通過定時任務排程中心可以檢視服務有哪些定時任務以及定時任務的執**況,對於執行失敗的定時任務可以手動執行等。

我們公司的微服務架構沒有定時任務排程中心,每個服務通過類似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註解就可以了,相關**如下:

@dailytask

("09:00:00")(

"$")

public

class

sendprize

extends

}

定時任務排程中心的管理介面如下:

定時任務配置 乙個簡單的定時任務排程中心設計方案

在日常開發中除了給前端開發介面,還要寫一些定時處理任務,比如乙個活動需要每天定時給所有使用者派發獎勵。乙個成熟服務框架需要乙個全域性的定時任務排程中心,通過定時任務排程中心可以檢視服務有哪些定時任務以及定時任務的執 況,對於執行失敗的定時任務可以手動執行等。我們公司的微服務架構沒有定時任務排程中心,...

乙個簡單 定時任務元件(quartz) demo

一 定時任務元件 quartz 1.應用場景 相當於鬧鐘,可以開發乙個或者多個定時任務 每天晚上12點生成當天的報表,第二天要看 訂單超時 延時傳送簡訊 2.定時任務元件quartz 概念和demo 1.quartz既可以單獨使用也可以跟spring框架整合使用,在實際開發中一般會使用後者。demo...

乙個簡單的定時任務小例子

強制 執行緒資源必須通過執行緒池提供,不允許在應用中自行顯式建立執行緒。說明 使用執行緒池的好處是減少在建立和銷毀執行緒上所花的時間以及系統資源的開銷,解決資 源不足的問題。如果不使用執行緒池,有可能造成系統建立大量同類執行緒而導致消耗完記憶體或者 過度切換 的問題。強制 執行緒池不允許使用 exe...