劉一田, 劉士進
(南瑞集團公司(國網電力科學研究院), 南京 210003)
多租戶高可用并行任務調度框架①
劉一田, 劉士進
(南瑞集團公司(國網電力科學研究院), 南京 210003)
描述了一種多租戶高可用并行任務調度框架MTHPT的設計思想、體系結構和實現技術, MTHPT包括3部分: 任務定義與配置、異步并行任務調度模式、消息告警與監視. 任務調度引擎和任務執行組件采用分開部署、異步并行調度和快速回調的模式, 快速釋放調度引擎占用的線程資源, 解決了部分任務執行周期長、定時任務無法按時執行等影響業務系統性能的問題. 任務調度配置提供了多租戶應用模式. 實驗分析及評估表明, MTHPT提高了應用系統的任務調度并行調度效率和穩定性.
多租戶; 高可用; 異步調度
在大型系統中, 任務調度是一項基礎性的需求.對于一些需要重復、定時執行或者耗時比較長的任務經常會被剝離出來單獨處理, 而隨著任務規模與復雜性的上升, 任務調度服務框架也就隨需而生. 設計良好的任務調度框架需要具備可靠性及伸縮性, 它可以管理并監控任務的執行狀態, 提供穩定可靠的調度模式調度任務, 以保證任務的正確執行.
文獻[1,2]概述了多租戶環境下多任務調度算法的劃分, 不同的調度算法會對系統的整體性能有重要的影響, 目前在實時多任務的調度算法主要采用優先級驅動調度算法, 根據任務的優先級確定時序, 優先級驅動的調度算法分為靜態調度和動態調度兩種. 在靜態調度算法中, 所有任務的優先級在設計時就確定下來了, 且在運行過程中不會發生變化; 在動態調度算法中, 任務的優先級則在運行過程中確定, 并可能不斷地發生變化. 靜態調度比較簡單, 但缺乏靈活性,不利于系統擴展. 動態調度在增加靈活性的同時增加了復雜性. 這些任務調度的調度算法常采用的時間片輪轉和優先級搶占等調度策略, 任務調度方式采用單機多線程的方式調度任務資源, 每次任務調度時都會創建一個新的調度線程, 由于業務系統中部分統計類任務本身執行耗時較長, 且調度線程采用同步方式一直等到服務調用結束后才回收, 在多數情況下, 線程資源在長時間空等而形成浪費, 個別任務執行異常也會占用線程不釋放資源, 導致調度服務的線程池快速飽和, 出現無法啟動新任務、任務延時執行、任務不執行的情況, 且偶爾會發生任務調度服務器宕機的情況.
一種有效的任務調度和分配算法是多核處理器獲取高性能的關鍵因素. 因此, 本文設計了一種多租戶高可用并行任務調度框架MTHPT, 解決業務系統中出現的上述問題, 提升基礎軟件開發平臺的通用技術支撐能力. 通過可視化界面定義任務的執行組件, 任務執行組件支持REST服務和本地服務Bean兩種執行組件, 為了增加引擎的穩定性, MTHPT默認使用REST服務接口定義執行組件, 即任務執行組件和調度引擎作為兩個獨立的應用, 調度引擎只負責觸發框架任務執行組件封裝器的調用, 由封裝器啟動應用線程執行任務調度. 任務的定義支持調度規則的配置,支持手工任務、周期任務和Cron表達式任務規則. 在部署架構上支持調度引擎和執行任務分開部署, 在調度方式上采用異步并行執行部署在應用中的框架任務執行組件封裝器, 通過執行組件接口約束自定義業務執行組件, 在執行具體的任務調度時, 在任務執行組件封裝器中分別啟動業務應用服務器線程、調用部署任務的應用線程執行任務、基于RESTful服務異步回調告知任務調度引擎任務的調度狀態, 及時通知任務調度引擎釋放任務調度服務的調度線程, 避免任務調度延遲和調度服務資源占用.
本文描述的高可用并行任務調度框架如圖1所示,其主要具備如下特征.
(1) 支持多租戶定制個性化的調度任務, 租戶可以申請任務調度服務集群中的子集為指定應用系統提供任務調度服務.
(2) 調度引擎和執行任務分開部署: 任務調度的引擎與執行任務需要分開部署, 目的是提高任務引擎的穩定性, 即使二次開發編寫的任務組件不穩定, 也不影響任務引擎的穩定運行, 另外也是為了減輕任務引擎應用服務的壓力.
(3) 異步并行調度: 調度引擎異步并行調度任務,調度引擎在調用遠程RESTful的任務組件時, 遠程執行組件分發器接收到調用的消息后, 從線程池中獲取一個可用的線程執行任務, 任務分發器非阻塞調用執行組件, 立即返回引擎的調用, 節約了引擎中線程池的可用線程, 當遠程任務分發器執行任務完成, 則將執行結果通知給引擎, 引擎收到通知后在任務實例日志表中記錄任務實例執行情況, 如任務執行時長、執行結果、執行的異常信息等.

圖1 多租戶高可用并行任務調度框架
(4) 任務定義模式: 通過任務執行組件接口約束自定義任務, 任務定義采用RESTful服務模式和本地服務組件, 但是為了服務的穩定性, 推薦使用RESTful服務模式, RESTful服務組件支持異步調用,每一個任務定義都是一個RESTful資源映射. 在RESTful資源類中分別啟動本地應用線程、將啟動成功或失敗結果告知調度引擎, 使用創建的應用線程執行任務, 并用日志記錄執行異常信息.
(5) 監控分析告警: 引擎中的任務在后臺調度執行, 無法通過前臺查看任務的調用和執行結果, 因此在后臺記錄任務實例日志及消息總線推送告警兩種方式, 通過查看任務實例日志可分析任務在什么時間點被調度, 以及執行的時長、執行是否成功和執行的異常信息等. 對執行任務超時未完成、任務超時未開始等信息發送到消息總線ActiveMQ[3], 由消息總線推送到前端進行告警消息展示.
(6) 任務之間的靈活依賴: 具有依賴關系的任務調度在傳統調度策略中的研究由來已久[4], 典型的依賴任務調度模型都是建立在圖的基礎之上[5,6], MTHPT可將任意一個任務作為自己的父任務進行依賴觸發.
(7) 調度服務集群與失效轉移: 任務引擎的集群是多套任務引擎服務連接同一個數據庫, 任務引擎服務基于數據庫資源鎖的機制實現任務獲取, 集群中任務調度服務爭搶已定義的定時任務, 任務調度服務集群中主機出現異常時, 不影響已執行調度任務的作業執行, 集群中其它任務調度服務正常接管調度服務.
高可用并行任務調度框架的執行流程任務調度分為八個步驟, 分別介紹如下.
(1) 編寫任務調度業務執行組件Bean, 配置任務調度規則. 業務執行組件根據MTHPT框架的執行組件編寫規則, 實現MTHPT框架的任務執行組件接口;完成組件定義后, 以租戶身份進入任務管理視圖, 在管理視圖中配置租戶域的業務執行組件類, 并編排任務調度執行組件的依賴關系和執行順序. 上述過程的定義結果通過數據表的方式存儲到任務定義存儲中.
(2) 任務調度節點從待執行任務記錄表讀取記錄,根據任務調度規則在指定的時間點或周期內從數據庫中讀取待執行的任務, 任務調度節點之間是爭搶的關系, 任務調度節點讀取任務記錄時鎖定任務記錄表,判斷當前任務是否存在父任務或后繼任務, 并遞歸查找所有關聯任務記錄, 將查找結果依據排序關系放到任務隊列中, 然后將這些記錄的調度狀態字段值修改為正在調度, 然后釋放表鎖, 其它任務節點在讀取任務記錄時, 如果發現任務調度表中記錄狀態為正在調度, 則放棄本次調度, 順序查找可調度的下一個任務,確保一個任務僅在一個任務節點上調度.
(3) 爭搶到任務記錄的任務調度節點啟動調度服務線程, 從任務隊列中依次取出任務, 異步觸發部署在業務應用節點上的框架執行組件包裝器RESTful服務并執行回調監聽. MTHPT框架定義了框架執行組件包裝器組件和任務執行組件接口組件, 框架執行組件包裝器組件中讀入參數中的業務執行組件配置, 包裝器組件通過依賴反射的方式注入業務執行組件, 在業務應用部署節點應用服務器中創建調度線程執行任務.
(4) 業務應用部署節點應用服務器線程創建成功,則由該應用線程執行業務執行組件邏輯.
(5) 將業務應用部署節點應用服務器線程創建成功或失敗的消息提示發回給任務調度節點的調度服務線程.
(6) 任務調度節點線程根據成功或失敗的消息提示, 如果成功則回收當前調度服務線程, 如果失敗則執行重新調度.
(7) 業務執行組件邏輯在執行業務邏輯過程中,將執行完成或異常失敗等信息記錄在日志記錄中, 并同時將異常信息發往消息總線, 由消息總線推送到前端, 執行完成后將任務執行狀態修改為已完成.
(8) 分析監控組件根據日志進一步分析業務執行組件的執行情況, 提供監視及分析視圖.
多租戶高可用并行任務調度框架 MTHPT 采用任務執行組件接口限定自定義任務所必須實現的方法,框架調度引擎僅對框架封裝的任務執行組件包裝器組件進行異步并行調用, 任務執行組件包裝器組件實現了應用線程的創建、任務定義時配置的自定義業務執行組件的實例化和執行, 異步回調通知等關鍵封裝, MTHPT框架會根據創建線程的結果, 快速返回調度引擎此次調度是否成功. 調度引擎在確定調度結果后,釋放調度服務的調度線程到線程池中. 已啟動的應用線程執行自定義任務組件, 當執行異常時用日志記錄并將異常信息發到消息總線由其推送到前端. 根據上述 MTHPT 的框架結構的設計, MTHPT包含幾點主要關鍵技術: ①任務定義和配置. 包括任務組件編寫、任務配置; ②異步并行任務調度模式; ③消息推送告警與監視.
(a) 任務定義和配置
任務的模型定義是一個四元組, 可描述為TD=<TN, TS, TR, BE>, 其中TN為租戶, TS是任務服務, TR是任務調度規則, BE是業務執行組件. 租戶申請需要使用的任務調度服務, 服務可以由任務調度服務集群中的一個或多個節點組成, 通過統一的任務調度規則配置視圖入口, 配置任務的調度周期、起止時間、觸發次數等規則, 在執行組件的選擇上, 可以選擇已實現框架約定接口的本地業務執行組件, 或者配置已實現框架約定接口的遠程RESTful服務地址, 如圖2所示.
(b) 異步并行任務調度模式
當任務執行組件的定義采用遠程RESTful服務定義時, 框架的任務執行組件封裝器和業務執行組件默認與業務應用服務合并部署, 作為業務應用功能的一部分. 如果任務執行組件的執行比較消耗內存等關鍵資源, 也可以將組件封裝器和業務執行組件分開獨立部署.

圖2 任務定義和配置
任務調度服務中的任務調度器從數據庫中讀取并實例化任務及任務調度規則, 每個任務都對應一個子任務隊列, 子任務隊列中的任務以同步的方式順序執行, 任務調度器異步并行調用每個任務對應的子任務隊列中的子任務, 觸發子任務的執行組件封裝器的RESTful服務接口, 等待組件封裝器的執行結果, 組件封裝器在創建線程后即可將創建成功或失敗的消息返回給任務調度器, 任務調度器接收到成功消息后,回收調度線程, 在接收到失敗消息后, 重新執行任務.異步并行任務調度過程如圖3所示.

圖3 異步并行任務調度模式
為了實現任務編排功能, 任務執行組件執行完成后, 調用任務調度服務的更新任務狀態方法, 更新指定指定任務的子任務隊列中的子任務執行狀態, 如果子任務隊列中存在后續任務, 則繼續觸發后續任務調度執行.
本文利用自主設計加工的一種試驗裝置,測定了不同摻量粉煤灰混凝土的水和氣體(氮氣)滲透系數;同時,用NMR測試了試驗混凝土的孔隙率及其孔徑分布等微觀結構參數。基于測試結果,研究了粉煤灰摻量對混凝土的水、氣體滲透性及微觀結構參數的影響,分析了粉煤灰混凝土的水、氣體滲透性與其微觀結構參數之間的關系。
(c) 消息推送告警與監視
任務執行過程出現異常時, 首先通過日志組件記錄異常信息, 并將異常信息發送到消息總線ActiveMQ上, 消息的發送采用發布/訂閱模式, 消息主題通過配置文件動態獲取, 前端任務異常提醒組件以websocket方式保持與ActiveMQ的長連接, 接收指定消息主題的推送文本并解析, 將解析的結果封裝后以彈窗方式提示給用戶.
對異常執行的任務執行組件日志進行分析統計,提供日志監視視圖對分析結果進行展示, 能更直觀發現任務調度問題.
實驗測試環境由8臺8核8G內存的PC服務器(HP DL 380 G4 378735-AA1)組成, 其中數據庫、任務調度服務、應用服務主機比例為1:4:3, 數據庫和應用服務采用國家電網公司設備(資產)精益運維管理系統的測試數據庫和應用服務, 任務調度服務分別以傳統的同步調度和MTHPT框架模式的異步調度模式各部署2臺, 任務調度服務和應用服務都通過集群方式提供服務, 調度任務的業務執行組件是對設備(資產)精益運維管理系統已有的統計任務進行修改, 實現了MTHPT框架的執行組件接口, 以不同租戶身份登錄任務調度管理視圖后分別以十分鐘、半小時、一小時、一天為調度周期配置調度規則, 觀察統計任務的調度效率和穩定性.
經過兩周的高負荷運行, 根據記錄的異常日志等信息, 統計分析如表1所示.

表1 傳統任務調度和MTHPT調度模式的實驗數據對比
表中實驗數據表明, MTHPT任務調度框架增強了任務調度服務的穩定性, 避免了任務調度延遲, 提高了調度效率. 但也發現了一些問題, 具體如下:
(1) 任務執行組件在執行結束后要調用任務回調器更新任務狀態, 任務狀態更新后并未及時反映到任務監視視圖中.
(2) 任務中的子任務隊列在發生任務調度異常時,需要對子任務隊列中的任務重新執行, 造成一定的資源浪費.
(3) 將需要實時處理的任務放入子任務隊列中,會影響實時性.
目前, 多租戶高可用任務調度框架MTHPT已在國家電網公司統一應用平臺(SG-UAP)中實現并大規模推廣應用, 取得了較好的應用效果.
本文研究了傳統的任務調度策略和任務調度模式,在此基礎上, 設計了多租戶高可用并行任務調度框架,給出了任務調度定義模式和調度引擎優化方法, 闡述了該框架的架構設計以及關鍵實現技術. 最后, 以基于國家電網公司設備(資產)精益運維管理系統的應用運行實例為背景, 給出一個多租戶多任務并行任務定義、業務執行組件接口和任務調度的實現過程. 實驗結果、 效率評估及生產運行實踐表明, MTHPT 提升了任務調度服務的調度效率和穩定性, 提高了生產應用信息系統的服務水平. 后續將針對遺留問題持續改進MTHPT框架.
1 Liu CL, Layland JW. Scheduling algorithms for multiprogramming in a hard-real-time environment. Journal of the ACM, 1973, 20(1): 46–61.
2 蒲汛,杜嘉,盧顯良.基于用戶優先級的云計算任務調度策略.計算機工程,2013,39(8):155–159.
3 The Apache Fundation. Apache ActiveMQ. http://activemq. apache.org/. [2016-04].
4 Nejad MM, Mashsyekhy L, Grosu D. Truthful greedy mechanisms for dynamic virtual machine provisioning and allocation in clouds. IEEE Trans. on Parallel and Distributed Systems, 2014, (99): 1–5.
5 Sih GC, Lee EA. A compile-time scheduling heuristic for interconnection constrained heterogeneous processor architectures. IEEE Trans. on Parallel and Distributed Systems, 1993, 4(2): 175–187.
6杜曉麗,蔣昌俊,徐國榮,等.一種基于模糊聚類的網格DAG任務圖調度算法.軟件學報,2006,17(11):2277–2288.
Multi-Tenant High Availability Parallel Task Scheduling Framework
LIU Yi-Tian, LIU Shi-Jin
(NARI Group Corporation(State Grid Electric Power Research Institute), Nanjing 210037, China)
This paper describes design ideas, architecture and implementation techniques of a kind of multi-tenant high availability parallel task scheduling framework named MTHPT. It consists of three parts: task definition and configuration, asynchronous parallel task scheduling mode, alarm messages and monitoring. Task scheduling engine and task execution components use separate deployments, asynchronous parallel scheduling and fast callback mode, quick releasing thread resource scheduling engine, which can solve such issues as: part of the task long implementation cycle, timed task that can not be performed on time and other issues that affect the business performance of the system. Task scheduling configuration provides a multi-tenant application model. Experimental analysis and assessment show that MTHPT improves the efficiency and stability of task parallel scheduling application system.
multi-tenant; high availability; asynchronous dispatch
國家電網公司科技項目“基于分布式技術的業務系統架構研究”
2016-05-29;收到修改稿時間:2016-07-25
10.15888/j.cnki.csa.005645