天天看點

分布式定時任務設計及其架構

1、為什麼需要分布式定時任務
  • 高可用:單機版的定時任務排程隻能在一台機器上運作,如果程式或者系統出現異常,就會導緻功能不可用。
  • 多任務管理複雜:一個系統可能會有很多需要定時執行的任務。當出現單機無法承載所有的任務時,一般會簡單地進行拆分,讓不同的機器各自承擔一定數量的任務。在這種方式下,需要由開發人員人工管理和配置設定各個機器上所負責運作的任務。并且可能因為人工配置設定的不合理而造成系統負載不均。
  • 單機處理極限:原本1min内需要處理1萬個訂單,但是現在需要1min内處理10萬個訂單;原來一個統計需要1h,現在業務方需要10min就統計出來。雖然我們也可以采用多線程、單機多程序處理等方式提高機關時間的處理效率,但是單機能力畢竟有限(主要是CPU、記憶體和磁盤),始終會有單機處理不過來的情況。
2、分布式定時任務設計思路
  • 排程子產品(排程中心): 負責管理排程資訊,按照排程配置發出排程請求,自身不承擔業務執行。排程系統與任務解耦,提高了系統可用性和穩定性,同時排程系統性能不再受限于任務子產品;支援可視化、簡單且動态的排程資訊管理,包括任務建立、更新、删除、排程運作和任務告警等。所有上述操作都會實時生效,同時支援監控排程結果以及執行日志,支援執行器故障轉移。
  • 執行子產品(執行器):負責接收排程請求并執行任務的業務邏輯。任務子產品專注于任務的執行等操作,開發和維護更加簡單和高效;任務一般是“無狀态”的,在任何一個節點運作都可以。執行子產品接收排程中心的執行請求、終止請求和日志請求等。
3、分布式定時任務架構
  • Quartz是Java領域著名的開源任務排程工具,是開源組織OpenSymphony在Jobscheduling領域的一個開源項目。Quartz完全由Java編寫而成,可以很友善地和Java的另一個架構Spring內建。支援豐富多樣的排程方法,可以滿足各種正常及特殊需求。支援任務和排程的多種組合方式,支援排程資料的多種存儲方式。支援分布式和叢集能力,負載均衡和高可用性。
  • Elastic-job是當當網開發的彈性分布式任務排程系統,功能豐富強大。由兩個互相獨立的子項目Elastic-Job-Lite和Elastic-Job-Cloud組成。Elastic-Job-Lite定位為輕量級無中心化解決方案,使用jar包的形式提供分布式任務的協調服務;Elastic-Job-Cloud采用自研Mesos Framework的解決方案,額外提供資源治理、應用分發以及程序隔離等功能。Elastic-job采用去中心化設計,主要分為注冊中心、資料分片、分布式協調、定時任務處理和定制化流程型任務等子產品。
  • TBSchedule是淘寶早期開源的分布式排程架構,基于ZooKeeper的純Java實作。其目的是讓一種批量任務或者不斷變化的任務,能夠被動态地配置設定到多個主機的JVM中的不同線程組中并行執行。所有的任務能夠被不重複、無遺漏地快速處理。這種架構任務的配置設定通過分片實作了無重複排程,又通過架構中Leader的選擇,存活的自我保證,提供了可用性和可伸縮性的保障。
  • SchedulerX是阿裡雲基于 Akka 架構自研的新一代功能強大、成熟穩定的分布式任務排程平台。SchedulerX為使用者提供各種各樣精确到秒級的高可用的任務排程服務,每日精準觸發排程萬億次,允許使用者配置任意周期性排程的單機或者分布式任務,提供精準、高可靠的定時任務觸發,上百萬超大規模任務高效并發處理和均衡排程。