最近需要設計一個分布式的定時任務的方案,從理論上來說,Quartz已經提供了一套完善的分布式定時任務的解決方案,但是由于系統目前已有JMS叢集和Redis Sentinel叢集,如果想要在目前已有的架構上,實作了一個簡單的分布式定時任務的話,如何來做了?總體架構設計圖如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZD9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVP9EVTuVjMi9WNXlVMoJTWxw2RiZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DNxEDOzgjM1EDMyMDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
redis叢集:提供分布式的緩存,以及實作簡單的分布式鎖http://blog.csdn.net/liuchuanhong1/article/details/54668460
Node1~Node3節點:定時從資料庫中查詢需要執行的任務,由于查詢的結果是List,如果3個Node節點同時查庫,并将查詢的結果推送到中間件叢集中,那麼待執行的任務肯定是會重複的(分庫的話,另說)。換句話說,同一時間,隻允許一個Node節點活動,沒有擷取到分布式鎖的節點則阻塞,直到擷取到鎖,同時避免出現單節點故障。
JMS叢集:解耦,Node節點會将從資料庫中查詢出的待處理任務打散後(充分利用多個任務Node的特性,比如此時查詢出來的待執行任務有10個,則可以将這10個任務分别推送到不同的Execute Node上執行,避免這10個任務在一個Node上執行)推送到JMS對應的隊列中。
Execute Node節點:監聽JMS的隊列,并從隊列中取出待執行的任務,并異步執行http://blog.csdn.net/liuchuanhong1/article/details/54603546