內容來源:宜信技術學院第4期技術沙龍-線上直播|宜信微服務任務調度平臺建設實踐html
主講人介紹git
梁鑫:宜信高級架構師&開發平臺負責人 github
本文字數:7693字web
導讀:現在,不管是互聯網應用仍是企業級應用,都充斥着大量的批處理任務,經常須要一些任務調度系統幫助咱們解決問題。隨着微服務化架構的逐步演進,單體架構逐漸演變爲分佈式、微服務架構。微信
在此背景下,不少以前的任務調度平臺已經不能知足業務系統的需求,因而出現了一些基於分佈式的任務調度平臺。這些平臺各有其特色,但也各有不足之處,好比不支持任務編排、與業務高耦合、不支持跨平臺等問題,不是很是符合公司的需求,所以咱們開發了微服務任務調度平臺(SIA-TASK)。本次分享主要圍繞SIA平臺展開,包括研發背景設計思路和技術架構,以及如何支持業務方。網絡
分享大綱:多線程
1、SIA-TASK的產生(背景、問題等)架構
2、SIA-TASK的核心設計思想(組成、運行、特性、關鍵點等)併發
3、SIA-TASK組成模塊(調度器管理、監控、日誌等)app
4、開源
如下爲直播視頻,可點擊回放,時長43m42s,建議在WiFi環境下觀看。
分享實錄
1.1 背景
1.2 種類
飛機型是指每一年/月/周/天固定某一時刻執行的任務。這種任務在咱們的業務系統中很是常見,好比天天1點要執行一個跑批任務去清理前一天的日誌;每個月10號要給公司全員發工資,這些都屬於飛機型任務。
地鐵型是指每隔固定時間執行任務,不可併發。咱們也常常遇到這樣的批處理任務,第一個任務沒有結束,第二個任務是不能夠執行的,這就是不可併發。
公共汽車型是指每隔固定時間執行任務,可併發。若是是公共汽車型的任務,前一個任務沒有結束,下一個任務也能夠按點開始執行。
1.3 問題
遺忘,忘記了還在運行的定時任務。在咱們公司發生過一個這樣的案例,若干年前的一個冬天,咱們的一個項目團隊用3個月的時間作了一個項目,運行一段時間後發現項目的效果並非很理想,便將相關的程序都停掉了,卻忘了有一個跑批任務的節點還在繼續運行,直到兩年後,這個節點產生的日誌把磁盤填滿了,觸發了監控報警,咱們才發現。
單點,就是沒有熱備,跑批任務是一個單點運行的定時任務,出了故障須要轉入手工處理。
依賴,利用時間差來處理依賴反覆形成問題數據。你們知道項目有的時候是須要有依賴關係的。好比某個項目的跑批流程A和跑批流程B存在前後次序,項目組設置跑批流程A在凌晨2點運行,跑批流程B在凌晨4點運行,從時間上保證前後次序,萬一跑批流程A執行時間過長,超過2小時,就會致使數據出現問題,須要手工處理出現問題的數據。
1.4 關係
串行,存在前後關係的兩個任務。即任務B在任務A後執行,要先執行任務A以後再執行任務B。
並行,能夠併發執行的兩個任務。好比任務B和C都要在任務A以後執行,而任務A執行完成後,任務B和C能夠同時執行,那B和C就是並行關係。
分支,根據前置任務的返回結果進行判斷,不一樣的結果執行不一樣的後續任務。好比返回0的時候,執行任務A,返回1的時候執行任務B,這是一種分支的狀況。
1.5 思考
平臺化。項目團隊老是但願把更多的精力投入到業務開發中,但願把其它與業務開發無關的事情儘量地放到架構團隊。他們但願有一個執行任務的平臺,僅僅須要把編寫好的業務邏輯放到這個平臺就能夠了,這個平臺會完成全部的工做,項目組只須要關心業務邏輯。
微服務。爲了更好地知足項目的需求,咱們但願能把任務的業務邏輯和任務的編排調度區隔開來,採用註冊和發現機制來建設任務調度平臺,與業務相關的部分交給項目團隊處理,把其餘的部分交給任務平臺來處理。
1.6 因素
任務編排。多個業務之間的定時任務存在流程次序,前面提到任務之間有並行的關係、有串行的關係,還有分支的關係,咱們但願平臺能有相應的編排功能去處理和支持這些任務。
任務分片。對於一個大型任務,須要分片並行執行。
跨平臺。除了使用 Java 技術棧(SpringBoot、Spring等)的項目以外,還要可以支持使用其餘語言的應用。
無侵入。業務不但願與調度高耦合,只關注業務的執行邏輯,但願平臺對業務自己代碼是無侵入的,將影響降到最低。
高可用/故障轉移。調度系統自身必須保證高可用,不能有單點,任務執行過程當中遇到問題有補償措施,可以平滑處理,減小人工介入。
可視化。任務調度的操做提供可視化頁面,方便使用。
實時監控。平臺要有實時監控系統,實時獲取任務的執行狀態。
動態編輯。業務的任務時鐘參數可能變更,在可視化的基礎上,對全部任務執行的操做都實時反映到業務系統中去,不須要停機部署。
2.1 簡介
2.2 術語
-
任務(Task) : 基本執行單元,執行器對外暴露的一個HTTP調用接口; -
做業(Job) : 由一個或者多個存在相互邏輯關係(串行/並行)的任務組成,任務調度中心調度的最小單位; -
計劃(Plan) : 由若干個順序執行的做業組成,每一個做業都有本身的執行週期,計劃沒有執行週期; -
任務調度中心(Scheduler) : 根據每一個的做業的執行週期進行調度,即按照計劃、做業、任務的邏輯進行HTTP請求,它是一個單獨的節點; -
任務編排中心(Config) : 編排中心使用任務來建立計劃和做業; -
任務執行器(Executer) : 接收HTTP請求進行業務邏輯的執行; -
Hunter: Spring項目擴展包,負責執行器中的任務抓取,上傳註冊中心,業務可依賴該組件進行Task編寫。
Job、Task、Plan的關係
2.3 組成

-
任務執行器 ,就是你的業務代碼在哪裏,這是屬於項目組的。 -
任務註冊中心 ,咱們用的是ZooKeeper。 -
任務編排中心 -
持久存儲 ,咱們用的是MySQL。 -
任務調度中心
2.4 運行
2.5 特性
1)基於註解自動抓取任務
2)基於註解無侵入多線程控制
3)高度靈活任務編排模式
4)調度器自適應任務分配
2.6 關鍵點
-
任務流 。實現任務與任務之間可配置的流向關係,造成有向無環圖(DAG)。任務流可由定時時間(Cron 表達式)或外部請求(提供 API 地址) 開始,根據 DAG 邏輯執行。 -
元數據管理 。微服務中各個任務元數據的管理同步數據抓取、錄入。 -
智能運維。 可視化的任務實時監控,全部監控都是有頁面能夠看到的;實時預警機制,出現問題的時候,會發送郵件或短信給相關人員告警;半智能化的自主修復,嗅探重試,不須要人工干預。 -
資源隔離。 進程間的資源隔離;進程內的資源隔離,提升系統吞吐,提供穩定性。時鐘用的是Core Schedule,一個調度中心對一個項目組用一個Core Schedule,每一個項目組在同一個調度的時候,同一個調度器上都是隔離的,一個項目組出問題,不會影響到其餘的項目組,這就至關於表明了隔離性負載均衡。 -
負載均衡。 調度中心調度任務的時候,任務的執行週期時間不同,可能有的任務須要的時間長一點,有的任務須要的時間短一點,調度器的資源也不太同樣,有的CPU高一點,有的CPU低一點,那如何保證調度負載均衡?如何保證資源隔離的負載均衡?咱們會根據這種任務調度的歷史值(任務耗時)以及機器自己性能的值進行考量,使每個任務調度中心擁有的調度數量差很少、消耗也差很少。這是一種新的負載,而不是簡單的流量負載。
3.1 首頁
-
調度器信息:調度中心調度器的數量。 -
調度次數:調度中心調度Job的歷史累計總數。 -
對接項目詳情:調度中心對接的項目組總數,Job總數。
-
Job上限值: 所能負載的Job動態閾值; -
Job運行數量: 該調度器當前運行的Job數量; -
Job預警值: 當調度器運行的Job數超過預警值時,會發郵件通知管理員。
3.2 調度器管理

-
JobKey :所配置的Job名稱,每一個Job都有本身的名字。 -
類型 :配置Job的定時任務類型,分爲Cron與fixRate兩類。 -
Job類型值 :若是是Cron表達式,6位時間戳怎麼寫;若是是fixRate,那就是須要間隔多少時間。 -
預警郵箱 :該Job配置的預警郵箱。 -
描述信息 :描述該Job的功能信息,便於管理員可以迅速發現某臺調度器所搶佔的Job詳情。
-
工做調度器: 這類調度器具備搶佔和調度Job的能力。對某調度器進行下線操做,它會當即失去搶佔Job的能力,已經搶佔的Job執行完畢後會自動釋放,進而被其餘調度器搶佔,調度器下線後會進入下線調度器列表中;工做調度器列表提供下線以及批量下線的功能。簡單來講,工做調度器就是正在工做中的調度器。 -
下線調度器 :這類調度器進程仍然存活,但失去了搶佔Job與參與調度的能力。對這類調度器執行上線操做,會進入工做調度器列表,且開始具備搶佔和調度Job的能力;下線調度器列表提供上線及批量上線的功能。就是說,下線調度器依然活着,只是再也不參與搶佔Job,以前已經有的Job仍是會繼續執行完成,若是點擊上線就從新具有搶佔Job的能力,變成工做調度器。 -
離線調度器 :這類調度器進程再也不存活,當下線調度器進程死亡後,會自動進入離線調度器列表,這類調度器進程從新啓動後,會自動進入下線調度器列表;離線調度器列表也提供刪除及批量刪除的功能。離線調度器通常都是出現問題了,多是進程掛掉了,也多是網絡故障了。 -
白名單 :將某個IP加入白名單以後,它具備調用全部執行器實例的權限;白名單列表提供批量刪除的功能,刪除該IP後自動失去該權限。
3.3 調度監控

3.4 Task管理
-
一部分Task使用了sia-Task-hunter組件,經過標準註解實現Task的自動抓取,這類Task不容許修改; -
另一部分Task是由用戶手動添加的,我知道訪問的URL和HTTP地址,手動添加進來,這部分Task支持跨平臺的抓取,並且能夠修改和刪除。
3.5 Job管理

-
隨機,從可選的列表中,隨機選擇實例,即IP+端口; -
固定IP,指定實例,隨後須要從可選列表中人工指定實例。
-
STOP,中止策略,調用失敗則整個Job中止,再也不執行後續Task; -
IGNORE,忽略策略,調用失敗則跳過該Task,繼續執行後續Task; -
TRANSFER,轉移策略,選取該Task的其餘實例執行,若是依然失敗,則使用中止策略; -
MULTI_CALLS_TRANSFER,屢次調用再轉移策略,重複調用該Task屢次,若是依然失敗,則使用轉移策略。
3.6 調度日誌
-
執行狀態: 表示該Job執行結果; -
執行時間 :表示調度器調度Job的時間; -
執行完成時間: 表示Job執行完成的時間; -
調度信息: 表示執行Job的調度器實例; -
執行信息 :Job執行的具體信息,而且已實現Job與所引用的Task的執行日誌信息的關聯,日誌默認保存七天。
⭐️⭐️⭐️歡迎加入「SIA-TASK開源羣」。進羣方式:請加小助手微信(微信號:creditease_tech)回覆「SIA」。
◆ ◆ ◆ ◆ ◆
如需轉載請與小助手(微信號:creditease_tech)聯繫。發現文章有錯誤、對內容有疑問,均可以經過關注宜信技術學院微信公衆號(CE_TECH),在後臺留言給咱們。咱們每週會挑選出一位熱心小夥伴,送上一份精美的小禮品。快來掃碼關注咱們吧!
注:文章封面原圖素材來源於網絡,如有侵權請留言刪除。
⏬點擊「閱讀原文」查看更多技術乾貨
本文分享自微信公衆號 - 宜信技術學院(CE_TECH)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。