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