1. 程式人生 > >為社麽要用分布式集群任務調度?

為社麽要用分布式集群任務調度?

統一 定義 混亂 tab 好的 所有 線程調度 ice quartz集群

作為一個開發者,避免不了定時任務的問題,最粗暴和簡單直接的解決方案就是crontab。當然在機器少,任務不多,定時任務之間關聯少的情況下,crontab效率還是比較高和便捷的。但當機器越多、定時任務越多,各個任務聯系越緊密的情況下,用crontab進行定時任務的管理配置,就會非常混亂,嚴重影響工作效率。

機器多、定時任務多的情況下,就會遇到以下問題:
1、每個服務器各個用戶下的crontab任務管理混亂,生命周期無法統一協調管理
2、定時任務運行異常告警難以統一對接
3、任務A和任務B如果存在互斥關系,crontab很難進行互斥處理
4、隨著時間增長,當定時任務達到幾千上萬的時候,定時任務就非常難以管理,線上跑了多個定時任務,每個定時任務什麽時候運行,屬於哪個應用和哪個開發負責等等問題變得很難解決。

Linux原生Crontab調度系統和Quartz對比:

1、執行粒度方面:
Crontab:進程調度
Quartz:線程調度
線程調度優勢:一是更節省資源,二是可以在進程內做數據交換,做數據交換這點很重要。

2、平臺依賴性:
Crontab支持Linux系統
Quartz由於是Java實現,所以支持跨平臺。

3、調度操作集上:
Quartz的設置更為靈活,可以很方便的通過代碼完成各種自定義需求,而且完全閉包Crontab。
但是Crontab的最小調度單元為分鐘級,而Quartz可以更細,Crontab實現自定義需求比較麻煩。

4、Job監控方面:
Quartz支持Listener,對job運行情況監控很方便,並且能用JobStores進行調度信息的持久化(內存、DB均可),進而可以實現job可視化

5、高可用:
Quartz支持分布式集群,這一點很重要,而且實現很方便。

為什麽要用分布式集群任務調度?
想象一下,現在有 A 、B、 C 3 臺機器同時作為集群服務器對外統一提供 SERVICE,3 臺機器上各有一個 QUARTZ Job,它們會按照即定的 SCHEDULE 自動執行各自的任務。由於三臺SERVER 裏都有 QUARTZ ,因此會存在重復處理 TASK 的現象。一般的解決方案是只在一臺服務器上裝 QUARTZ ,其它兩臺不裝,這樣的話其實就是單機了,quartz會存在單點問題,一旦裝有quartz的服務器宕了,服務就無法提供了。當然通過改 QUARTZ JOB 的代碼也可以實現,但是這對開發人員要求比較高,而且可能會出現其他問題。然而quartz本身就提供了很好的集群方案。quartz集群需要數據庫的支持(JobStore TX或者JobStoreCMT),從本質上來說,是使集群上的每一個節點通過共享同一個數據庫來工作而達到高可用的。分布式集群任務調度,quartz是一個比較好的選擇。簡單,強大,穩定。

分布式集群時有個問題,就是所有服務器時鐘應當要同步,以免出現離奇且不可預知的問題。

為社麽要用分布式集群任務調度?