塗鴉智能分佈式定時調度系統Sigmax設計與實踐

1.導讀

Sigmax是塗鴉智能中間件團隊基於Golang開發的一款高性能,分佈式的定時任務調度引擎。針對IoT領域特有的複雜多樣的定時任務場景,Sigmax提供了一套統一,穩定,精準的定時調度平臺,來協助公司內各業務線方便的實現定時場景。數據庫

目前Sigmax已經在公司內部穩定運行了1年時間,單集羣的日任務調度、日均任務觸發數達千萬次。架構

2.背景

塗鴉智能做爲全球領先的AI+IoT平臺,鏈接着海量的智能設備,天天會有大量的用戶控制本身的智能設備以實現一些智能化的場景,好比:併發

  • 用戶A,天天早上7點自動打開窗簾;
  • 用戶B,當訪客經過智能門禁以後,定時移除訪客的權限;
  • 用戶C,日出或者日落以後,延時執行一個聯動的場景,等等;

除此以外,咱們的內部服務之間也存在大量的定時任務,好比:負載均衡

  • BI同窗天天定時執行報表生成;
  • Devops同窗天天定時檢查待維護機器;
  • 定時檢查任務清單,等等;

最後,咱們還但願實現一些延時消息的場景。運維

在Sigmax系統上線以前,以上的這些需求都散落在各自的系統當中經過各自的技術方案來實現,形成了技術棧不統一或者重複造「輪子」的現象。分佈式

咱們也調研了一些開源項目。首先,做爲開源任務調度的佼佼者Quartz,其調度邏輯和任務處理邏輯耦合在一個項目中,增長項目的複雜性的同時調度系統的能力將受限於業務處理能力。而偏偏在咱們的場景中,任務的處理邏輯因業務場景而異,所以在設計上咱們能夠將任務處理解耦至各業務系統中,專一於打造任務的調度引擎,以達到精準、高性能的目標。性能

另外,還對比了諸如machinery,cron,kala等項目,都沒法在定時任務模型,系統可擴展性,任務的低延時調度,以及系統高吞吐等方面滿同時足咱們的業務需求,而在任一系統上進行二次開發同時知足功能,性能,穩定性的要求都存在較大的改形成本和維護成本。優化

所以,咱們但願提供一套統一的平臺,對IoT領域定時、延時等定時任務場景方便接入的同時,兼顧穩定性,準確性,高吞吐率,同時在功能方面作到貼近業務的「剛恰好」。架構設計

3.系統設計

當咱們看到傳統的定時任務調度方案,將定時任務集中存儲在數據庫中,經過定時查詢數據庫的方式將要到期的任務取出並執行。隨着業務的增加,上述設計會出現三個方面的問題。設計

第一:隨着用戶或設備數呈幾何倍數的增加,系統的水平擴展存在必定的限制;
第二:較多的系統過分依賴關係型數據庫,業務增加以後對數據庫的壓力較大,須要進行復雜的分庫分表;
第三:業務場景決定,定時任務有明顯的高低峯,當大量的任務集中在某一個時間點,致使單節點的壓力過大,任務延遲較高,將會直接影響用戶體驗;

此外,基於業務分佈狀況,還需支持不一樣時區的設備定時任務的執行,以及不一樣國家的夏令時制度。

3.1 業務抽象

當咱們充分了解業務的定時場景和當前系統存在的痛點以後,咱們將全部的定時場景進行概括總結,最終抽象出三類定時任務模型:

  • cronJob:永久的週期性定時任務;
  • delayJob:倒計時、延時消息之類延時任務;
  • simpleJob:只在特定的時間段內,按照必定頻率執行的定時任務;

業務場景進行概括抽象以後,咱們着重思考怎麼解決當前系統的瓶頸和痛點,接下來咱們來看看系統的總體架構設計。

3.2 系統架構

Sigmax調度引擎核心是借鑑了時間輪(timewheel)的思想,並抽象出任務管理,定時調度、任務存儲以及分佈式集羣管理幾個模塊,以加強系統的調度能力和可靠性。總體結構分爲三層,從上至下分別爲APIServer接入層,分佈式調度集羣Scheduler,定時任務數據存儲層。其中,APIserver和Scheduler均實現無狀態,支持水平擴縮容。Scheduler通任務調度和存儲進行解耦分離,支持分佈式並行調度。最後, 咱們經過消息隊列,將定時任務的觸發通知對應的業務系統,實現Sigmax和業務系統解耦。

以上架構對應到系統當中各組件分別是:

  • Sigmax-Apiserver:業務接入、任務管理統一API入口;
  • Sigmax-Master:集羣管理控制器,負責調度引擎集羣管理和集羣負載均衡;
  • Sigmad:基於timewheel的定時任務調度引擎;
  • Sigmax-Console:一套任務管理和集羣管理的Web控制檯;

系統總體架構以下圖所示: 5454a15703edc193undefined

集羣數據流和控制流以下圖所示: f6b3367efbba8c84undefined

3.3 系統詳細設計

APIServer是Sigmax對業務提供的一套任務管理的標準接口,分別提供了RESTFul API和RPC API進行不一樣類型定時任務的生命週期的管理。

3.3.1 接口列表

  • 增長定時任務
  • 刪除定時任務
  • 修改定時任務
  • 查詢定時任務
  • 暫停定時任務
  • 恢復定時任務
  • 重置定時任務

3.3.2 基於Timewheel的Scheduler詳細設計

Sigmad是Sigmax的核心組件,基於時間輪timewheel的思想,負責定時任務的並行調度和觸發。Sigmad無狀態服務,所以能夠根據集羣的負載狀況進行水平的擴容和縮容。

將現實生活中時鐘的概念引入到系統設計中,定義一個時間週期和步長。通常來說,時間週期能夠設置爲一天24小時或者一週7* 24小時,而步長則能夠根據定時任務的時間精度要求,調整時間週期的步長,默認爲1分鐘。 所以每個時間輪被平均劃分紅7 * 24 * 60 = 10080個時間分片,系統中稱爲Step。

當指針每通過一個刻度(步長),系統便會獲取當前時間刻度上的全部的任務列表,加載至內存並進行調度計算和觸發。每個Sigmad節點對應一個時間輪, 所以越多的時間輪將在同一時刻承載更多的定時任務,增長系統吞吐和並行計算的能力。

注:每個Sigmad節點對應一個timewheel或者多個timewheel,但同一個timewheel在同一時刻能且只能被一個Sigmad調度執行。

時間輪以下圖所示: f74cb0c63d793c78undefined

多分區時間輪

爲了提升系統的吞吐力,提升Sigmax的併發調度能力以及避免在某個熱點時刻調度大量任務對系統形成壓力,從而影響任務調度的準確性,咱們設計了兩級併發。 第一級,經過對Sigmad節點的擴容,增長並行計算的能力; 第二級,引入多分區(Partition)的概念,將每個時間片的單一分區拆分紅多個時間片分區(Partition),以增長並行計算的能力。

注: Step和Partition一塊兒稱之爲一個Slot。

時間輪多分區以下圖所示: c5c4f214c226c240undefined

3.3.3 分佈式集羣管理

爲了保證集羣的高可用以及集羣的並行計算能力,Sigmax各系統均設計成集羣模式,避免單點故障。 其中:

  • Sigmax-Master實現了主從HA模式,同一時刻只有一個主Master進行工做,另外一個做爲Slave Standby;
  • Sigmad無狀態部署,支持水平動態擴縮容;

Sigmax-Master負責Sigmad集羣的管理,包括Sigmad集羣的擴容、縮容、score打分、Timewheel partition rebalance等。

集羣管理以下圖所示: 1d17bcb5613b58a1undefined

3.3.4 集羣負載

Sigmad負責從對應的timewheel slot上獲取Job並觸發執行。當集羣中某一個Sigmad負載太高時,Sigmax-Master負責將該節點的任務「遷移」至其餘的Sigmad節點,最終保持集羣的總體平衡。其工做原理以下: e910ab99766831b5undefined

4.集羣監控

Sigmax上線以後,咱們對任務和集羣兩個維度進行了監控和報警,以保證服務異常、集羣波動或者調度異常可以及時被發現。其中,集羣節點、服務的健康情況監控依賴於公司的基礎監控。這裏主要介紹的是,針對集羣任務調度進行多維護的監控。

4.1 任務監控

4.1.1 任務生命週期管理

針對整個集羣的負載狀況,咱們對集羣內全部任務的生命週期進行了監控,能夠直觀的看到集羣內的任務狀況,以下圖: da5f48096438746cundefined

4.1.2 調度準確度

針對影響業務穩定性、用戶體驗的關鍵因素,咱們對任務調度準確度進行了監控。調度準確度主要監控任務的觸發時間和用戶預期的任務觸發時間之間的誤差。調度準確度分爲幾個級別:

  • ontime:無延遲調度,全部任務都準時觸發;
  • delay:[1ms - 200ms]、(200ms - 600ms]、(600ms - 1000ms]、(1000ms - 2000ms]、(2000ms - ∞]

能夠發現,當前系統絕大多數任務都是無誤差調度執行。 8ac17313fe0b3bd6undefined

4.1.3 任務觸發成功率

任務觸發成功率統計了全部調度成功的定時任務,觸發各個系統的成功比例,主要用來發現任務沒法通知業務系統的情況發生。正常狀況下,全部任務所有正常送達業務,則該比率爲1。 114cc2fef13a77bbundefined

4.1.4 集羣管理監控

爲了便於集羣管控,咱們對Master的主從節點以及對Sigmad調度的timewheel進行監控,能夠直觀的觀察到集羣的動態變化。 d690c2514b641d83undefined

5.Roadmap

後續,Sigmax會不斷優化和在細節方面進行打磨,以應對不一樣業務系統和客戶的需求。

5.1 任務優先級

根據不一樣的業務場景,Sigmax支持的用戶但願能夠設置定時任務的優先級,級別越高的任務優先被調度執行,優先級低的業務能夠在必定的時間內延遲調度。

5.2 精細化集羣負載均衡

當前Sigmax實現了timewheel級別的負載均衡,可是每個timewheel下仍是有大量的時間分片和任務,粒度不夠細。下一步將進行基於時間分片進行集羣的負載均衡,以減小負載均衡帶來Sigmad節點的負載大的波動。

5.3 調度精確度優化

正如任務調度準確度監控所看到的,在某些大區的高峯期,會出現少許任務的調度延遲,咱們也將針對更高的負載進行系統優化設計,避免高峯期出現任務調度的延時。

5.4 任務可視化管理

任務可視化管理將會在現有的管控臺上增長更多的功能,以實現用戶更便捷的增長,修改,刪除任務,也將支持更多維度的任務查詢和統計、展現。

5.5 集羣可視化管理

集羣的可視化管理主要是從Sigmax系統的運維人員角度出發,提供一套集羣的擴縮容,節點運維,集羣負載均衡的管控臺。

6.總結

本文從塗鴉智能在AIoT領域特有的定時任務場景出發,介紹了塗鴉智能定時調度系統Sigmax的設計以及落地狀況。重點介紹了基於時間輪思想並基於此的創新優化設計,以知足業務的大規模、高性能要求;同時,還介紹了Sigmax各組件的分佈式和高可用設計,以知足系統HA;最後,介紹了任務和集羣的部分監控落地和以及展望。

後續會在此基礎上進行不斷的迭代,以知足更多業務場景,並將從穩定性和性能方面進行進一步的優化。歡迎感興趣的朋友多多交流。

本文原創發佈於塗鴉智能技術博客

https://tech.tuya.com/tuya-scheduler-sigmax/

轉載請註明出處

相關文章
相關標籤/搜索