1. 程式人生 > >普元 EOS定時任務實現原理

普元 EOS定時任務實現原理

普元平臺的定時任務能力是通過開源的作業排程框架Quartz實現的。

一、定時任務的基本概念:

  • 排程器:負責管理Quartz應用執行時環境,用於排程定時任務。
  • 定時任務:按照某種時間規則,被排程的任務。

               a、從有無狀態來說,有以下兩種:

                        有狀態任務:每次執行的任務是同一個例項,不能被並行執行;如果該任務的執行時間超過下次觸發的時刻,那麼下次的觸發將不會有作用。比如,一個有狀態任務執行時間是5分鐘,它的間隔時間是3分鐘;如果正在執行的時候,下次觸發時刻到達,則不會被執行。

                        無狀態任務:每次執行任務都是一個新的例項,可以並行執行。

              b、從執行的任務型別來說,有以下三種:

                        SCA服務任務:任務是一個SCA服務。

                        邏輯流任務:任務是一個邏輯流。

                        任意Java方法任務:任務是一個Java方法。

              c、觸發模式(觸發器):用於定義任務排程的時間規則,主要有下面兩種:

                        固定時刻觸發(簡單觸發器):一般用於實現間隔固定的時間執行任務,以及重複多少次,如每 2 小時執行一次,重複執行 5 次。

                        日曆週期觸發(複雜觸發器):使用Unix 'cron-like'表示式來定義時間規則,即利用一個包含 7 個欄位的表示式來表示時間排程方式。例如,"0 15 10 * * ? *" 表示每天的 10:15AM 執行任務。對於涉及到星期和月份的排程比較合適。

             d、錯失觸發:定時任務如果錯過觸發而沒有執行,比如系統停止;系統重啟後,就會針對錯失觸發的定時任務進行處理,一般有兩種錯失觸發策略(EOS_QRTZ_TRIGGERS表的MISFIRE_INSTR欄位):

                       立即重新觸發:預設策略,立即執行一次定時任務,而不管錯過幾次。MISFIRE_INSTR欄位值為1。

                       錯過觸發:下次觸發時間到來,再觸發執行定時任務。MISFIRE_INSTR欄位值為2。

            定時任務配置介面如下:

            

二、定時任務實現的基本原理:

  • 單機模式

                 排程器啟動一個排程執行緒,根據觸發器進行輪詢,如果觸發時刻到達,分配一個執行執行緒,執行定時任務。其中排程器及其狀態、觸發器及其狀態、定時任務及其狀態資訊都會持久化到資料庫中,所以系統停止,不會丟失定時任務;系統重新啟動,會重新定時觸發。

  • 叢集模式

                 定時任務的叢集,有負載均衡和故障切換的能力,可以給排程器帶來高可用性和伸縮性。叢集管理的實現是,叢集上的每一個節點通過共享同一個資料庫來工作的(Quartz通過啟動兩個維護執行緒來維護資料庫狀態實現叢集管理,一個是檢測節點狀態執行緒,一個是恢復任務執行緒),通過資料庫鎖來實現併發控制(如果不是叢集,使用記憶體鎖進行併發控制)。下圖是叢集模式拓撲圖:

           負載均衡是自動完成的,叢集的每個節點會盡快觸發任務。當一個觸發器的觸發時間到達時,第一個節點將會獲得任務,並改變任務狀態,成為執行任務的節點。

          故障切換的發生是在當一個節點正在執行一個或者多個任務失敗的時候。當一個節點失敗了,其他的節點會檢測到並且標識在失敗節點上正在進行的資料庫中的任務。任何被標記為可恢復的任務都會被其他的節點重新執行。沒有標記可恢復的任務只會被釋放出來,將會在下次相關觸發器觸發時執行。

  • 注意:

                如果是叢集模式,則要求每個節點的時鐘一定要一致,否則將發生無法預料的問題。

                根據經驗,建議簡單觸發器的間隔時間不要小於20秒。

相關推薦

no