此內容來自一位好朋友的分享,也是當初建議我寫博客提升的朋友。內容只做轉載,未做修改。
定時任務選型
背景
目前項目定時任務采用Spring Task實現,隨着項目需求的迭代,新增的定時任務也越來越多。我們也即將面臨如下
問題:
-
任務維護管理(不夠直觀,不方便管理)
-
單機事故 (故障)
-
任務調度混亂(串行,並行。串行可能阻塞)
那么,我們的需求是什么?
- 圖形化管理
- 支持集群,甚至分布式
- 任務調度靈活
選型
重點看了幾個目前比較流行的框架:
- quartz
- xxl-job
- elastic-job
- saturn
豪不誇張的說,java技術棧中的定時任務框架有兩種:
quartz 和
其它。
Quartz
quartz是一個基於數據庫的調度框架。支持集群,調度靈活。
缺點:
- 無圖形化界面,只提供了API,不方便管理
- 通過搶占數據庫鎖來防止多個節點執行同個任務。這也意味着當存在過多節點,任務多且執行頻繁的時候可能會有性能問題。
xxl-job
xxl-job是一款基於quartz封裝框架。相比quartz, 其支持友好的圖形化界面,功能更為強大。
特色功能:
- 調度器與執行器分離設計
- 支持集群,支持分布式(通過分片可完美支持)
- 任務管理靈活、強大(調度器管理頁面可直接寫源碼)
- 多語言支持
- 調度日志及執行日志
- 負載均衡
- 故障轉移、失敗重試
- 全異步,更輕量
- 線程隔離(快、慢線程池)
缺點:
- 搶占鎖問題
Elastic-job-lite
elastic-job也是一款基於quartz封裝的框架。對比xxl-job, 兩者設計上完全不同,xxl-job為中心化設計,通過調度中心下發調度指令給執行中心。而elastic-job則為無中心化設計。
特色功能:
- 無中心化設計
- 解決了quartz的搶占數據庫鎖問題,改為了zookeeper。
- 分片功能強大(整體都傾向於分片設計)
缺點:
- 引入分片機制后,會引入更多復雜的問題,例如拿到分片的機器執行失敗怎么處理等,目前還不是很完善
- 引入注冊中心zookeeper。 比較重,還要考慮zookeeper集群
Saturn
saturn 是基於elastic-job-lite的封裝,整體特性與elastic-job-lite相似。故不作具體描述。
對比
以上,分別簡述了各個框架,接下來,來個更為直觀的表格:
