


摘要:任務調度被廣泛應用于軟件應用系統中,為了降低耦合度,解決多租戶任務調度系統中任務調度和執行結果的及時通知問題,提出了在任務調度框架中應用ActiveMQ中間件構建消息總線進行消息傳輸和通信的技術思路。內容包括Ac-tiveMQ介紹、主流消息中間件比較、基于ActiveMQ通信的多租戶調度框架構建以及框架實現。
關鍵詞:多租戶;ActiveMQ;任務調度;消息中間件;低耦合
中圖分類號:TP311 文獻標識碼:A
文章編號:1009-3044(2020)18-0007-03
開放科學(資源服務)標識碼(OSID):
1 背景
在數據傳輸及解譯、消息通知、可執行程序調度等業務應用場景中,往往需要系統在指定時間進行特定操作,基于此類需求,任務調度框架被廣泛應用于軟件應用系統中。文獻[1-3]介紹了部分任務調度算法及任務調度框架構建方法。但任務調度框架僅關注任務的調度及觸發,對任務執行過程、執行結果信息的及時通知能力較為欠缺,尤其是在多并發、異步任務執行時,出現任務執行超時、中斷、異常的情況下,無法及時將任務執行信息通知主系統進行自動處理,為調度系統的可靠性和可伸縮性帶來較大弊端,嚴重影響業務系統連續運行,增加了人力資源成本和維護成本。
通過對ActiveMQ的研究與應用,解決多任務調度框架中出現的上述問題,通過ActiveMQ構建消息總線,完成系統內部通信及系統內外通信交互,降低系統耦合度,提高系統任務調度執行的可靠性。
2 ActiveMQ概述
ActiveMQ是由Apache基金會提供的基于Java語言開發的多協議開源消息中間件,支持OpenWire、Stomp、REST、WSNoti-fication、XMPP、AMQP等多種應用協議,可在Java、C、C++、C#、Rubv、Perl、Pvthon、PHP、.net等多種開發語言環境用使用,提供交叉語言功能,并可跨平臺應用。目前ActiveMQ已經支持MQTT(消息隊列遙測傳輸)協議,可應用于物聯網設備。其基于JMS規范提供了多種消息類型的傳輸,包括無有效負載消息Message、序列化對象消息ObjectMessage、文本消息TextMes-sage、鍵值集消息MapMessage、字節消息BytesMessage、數據流消息StreamMessage等,基本滿足系統常用消息通信類型要求,同時對JDBC和Journal的支持也滿足了消息持久化的要求[4]。
ActiveMQ消息通訊有兩種模式:主題(Topic)模式、隊列( Queue)模式。主題模式,亦可稱為發布/訂閱模式,這種模式下一個消息可以被多個訂閱者接收,訂閱者訂閱一個主題后,只能接收到自其訂閱之后發布的信息。訂閱者如果在發布者發送消息之后啟動,是無法接收到已經發送的消息的,除非發布者已經對消息進行了持久化存儲。隊列模式中,ActiveMQ構建一個消息存儲隊列,多個發送端可同時向隊列中發送消息,隊列被多個接收端同時監聽,但一個消息只能被一個接收端獲取,一旦被獲取就會消失,如果沒有被獲取,則會一直等待。
ActiveMQ是站在開發者的角度被設計的,可以通過JCon-sole和ActiveMQ自帶的WebConsole工具等形式來監控不同層面的數據,可通過配置的方式快速集成到Spring框架中,對二次開發和調試十分友好。
3 ActiveMQ框架及與主流消息中間件的對比
3.1 ActiveMQ框架介紹
ActiveMQ主框架部分從結構上可大致分為協議連接域、消息域、信息存儲域和網絡服務域幾部分,總體架構如圖1所示。
其中協議連接域( Connectors)封裝各類通信協議,用于創建和管理與代理通信客戶端的連接;
消息域(圖1 TopicRegion和Quene Region部分)封裝了Ac-tiveMQ的核心內容,除主題模式和隊列模式兩種消息通信模式相關實現外,其最主要部分為Transports,包括Transport,Trans-portServer和TransportFactory等;
消息存儲域( Message Store)定義了信息的緩存或持久化操作相關內容,持久化操作方面支持AMQ Message Store、Ka-haDB、JDBC、LeveIDB及Journal,目前ActiveMQ的默認持久化存儲為AMQ Message Store;
網絡服務域( Network Services)定義了用于支持代理的網絡服務組件,包括遠程服務檢測與發現、消息存儲和轉發、DR集群等。
3.2 主流消息中間件對比
目前消息中間件較多,且各具優勢,比價突出的有Ac-tiveMQ、RabbitMQ、Kafka、RocketMQ,ZeroMQ等,在實際應用過程中應根據實際需求的優先級進行選型,下面給出部分消息中間件的對比。
4 多租戶調度框架中ActiveMQ應用
4.1 多租戶調度框架設計
基于ActiveMQ通信的多租戶調度框架可分為租戶應用、數據存儲、核心服務及業務操作四個主要部分,整體框架設計如圖2所示。
其中租戶應用為用戶可視化操作界面,用于定義和操作調度業務,查看與監控作業執行狀態等。數據存儲部分將數據進行分區存儲,分為消息通信數據、任務調度數據、業務支撐數據。所有租戶操作均以消息形式通知ActiveMQ消息總線[6],為防止任務被重復執行,系統通過隊列(Queue)模式向任務驅動模塊傳輸信息,任務調度端消息代理獲取到租戶信息后,進行指定任務定義并根據任務觸發器定義信息進行立即執行或在指定時間執行,各業務操作模塊均可使用獨立線程執行,提高調度效率,降低系統耦合。任務執行完成后,將執行信息和結果寫回消息隊列,客戶端獲取后刷新狀態列表。
對于系統租戶使用者,可通過操作界面直接調用已經定義好的任務,通過任務開放式接口進行參數設置。對于二次開發者,可遵循頂層任務接口規范,自定義任務插件邏輯和處理流程,測試后上傳至任務插件庫自動加載供租戶使用。
4.2 框架實現
框架實現的核心是調度和通信。通過租戶ID與任務的關聯,對任務加以區分和控制,系統調度部分采用Quartz中間件[7],租戶可通過可視化界面進行Quartz Job的定義與驅動[8],可根據業務需要擴展定義新的任務,在擴展定義時需遵循Quartz框架要求繼承和實現Job類,為了實現系統任務的動態加載和調度,在核心服務層定義了通用Job創建工廠類,通過反射模式創建任務。核心代碼如下:
Class<!--? extends Job--> jobClass=new CascadingClassLoad-HelperO.loadClass(tempjob.geUobClassName0, Job.class);//動態加載任務
JobDetail j obDetail= JobBuilder.newjob(j obClass).withldenti-ty(tempjob. getjobKey0, tempjob. getGroupKey0). withDescription(tempjob.getjobName O).build0;//創建任務
Scheduler scheduler= SchedulerManager.getInstanceO.getDe-faultTemplatesO.getScheduler0;
scheduler.schedulejob(j obDetail.trigger);//執行任務
上述代碼中,tempjob為反序列化的任務屬性信息,由租戶定義并經消息總線傳輸至服務層進行處理,傳輸采用序列化文本信息。租戶應用端與任務端均具備消息的接收與發送能力,其中租戶應用端發送任務定義數據,接收任務執行狀態和結果信息,而任務端與之相反。ActiveMQ傳輸部分核心代碼如下:
Templatejob tempjob=new Templatejob0. setName(”job”).setGroup("group”).setTrigger(”25”);//定義任務模板對象
TextMessage message=session.createTextMessage(tempjob.toString0);//創建序列化任務消息對象
producer.send(message);//發送消息
ActiveMQ支持多種消息類型,在實際業務場景中可考慮使用多種消息類型混合的方式,加強通信能力。
5 總結
基于ActiveMQ通信的多租戶任務調度框架即可供用戶直接使用,又可作為基礎框架快速完成二次開發,該框架可用性高、耦合度低,可適用于多種業務場景。在對于資源集約化高度要求的情境下,可考慮將通過該框架對一個業務體系中的所有可執行任務進行統一管理調度,在框架通信穩定性與服務高效性方面,可考慮ActiveMQ集群化部署配置,如何進行分布式執行與調度、優化負載均衡將是框架進一步的探究和擴展方向。
參考文獻:
[1]汪瑩,陳新鵬,基于集群計算的任務調度算法研究[Jl.現代計算機,2020(9):8-10,16.
[2]王秀,孫忠林,姜莉.任務定時調度在企業級開發中的研究[J].電子科技,2015,28(10):100-102,107.
[3]劉一田,劉士進.多租戶高可用并行任務調度框架[Jl.計算機系統應用,2016,25(12):280-284.
[4] Apache ActiveMQ. ActiveMQ HomePage[EB/OL].[2020-03-02].http://activemq.apache.org.
[5]Apache ActiveMQ. ActiveMQ Architecture[EB/OLl. [2020-03-02].http://activemq.apache.org/code-overview.
[6]戴俊,朱曉民.基于ActiveMQ的異步消息總線的設計與實現[J].計算機系統應用,2010,19(8): 215,254-257.
[7]張康.基于Quartz的分布式定時任務調度模塊的設計與實現[D].南京:南京大學,2019.
[8]葉剛.基于Quartz的可視化定時任務管理方案[J].電子技術與軟件工程,2018(17):139-140.
【通聯編輯:謝媛媛】
作者簡介:蘇志宏(1987-),男,廣西南寧人,高級工程師,本科,主要研究方向為計算機應用技術、氣象與自然資源應用系統開發研究。