定時任務知多少(三)——任務排程的叢集方案
Quartz是Java領域最著名的開原任務排程工具。Quartz提供了即為廣泛的特性,如前文講的持久化任務、本文將要介紹的叢集,以及分散式任務等等。Quartz有完全由Java編寫,方面整合Spring;伸縮性、負載均衡和高可用的特點。
Quartz叢集部署
Quartz叢集中的每個節點是一個獨立的Quartz應用,它又管理著其他的節點。該叢集需要分別對每個節點分別啟動或停止,不像應用伺服器的叢集,獨立的Quartz節點並不與另一個節點或是管理節點通訊。Quartz應用時通過資料庫表來感知到另一個應用。只有使用持久化的JobStore才能完成Quartz叢集。
PS:應用伺服器的叢集是每臺伺服器上,都部署相同的應用,通過類似於Apache這樣的工具,來分攤應用伺服器的訪問壓力;而Quartz的叢集則不能使用類似的方式實現叢集。
原理:
叢集通過故障切換和負載平衡的功能,能給排程器帶來高可用性和伸縮性。目前叢集只能工作在JDBC-JobStore(JobStore TX 或者JobStoreCMT)方式下,從本質上來說,是使叢集上的每一個節點通過共享一個數據庫來工作的。(Quartz啟動兩個維護執行緒,來維護資料庫狀態實現叢集管理,一個是檢測節點狀態的執行緒,一個是恢復任務執行緒)。
負載平衡是自動完成的,叢集的每個節點會盡快觸發任務。當一個觸發器的出發時間達到時,第一個節點將會獲得任務(通過鎖定),稱為執行任務的節點。
故障切換的發生是在當一個節點正在執行一個或多個任務失敗的時候。當一個節點失敗了,其他的節點檢測到,並且標識在失敗節點上正在進行的資料庫中的任務。任何被標記為可恢復的任務都是被其他的節點重新執行。沒有標記可恢復的任務只會被釋放出來,將會在下次相關觸發器觸發時執行。
未完待續。。。