陸穎



關(guān)鍵詞:定時(shí)任務(wù);微服務(wù);分布式;XXL-JOB;可視化
中圖分類(lèi)號(hào):TP319 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2023)14-0039-03
0 引言
定時(shí)任務(wù)是指按照特定時(shí)間周期運(yùn)行的任務(wù)。使用場(chǎng)景為在某個(gè)固定時(shí)間運(yùn)行或者周期性地去執(zhí)行某個(gè)任務(wù),比如:每天24點(diǎn)做數(shù)據(jù)匯總,定時(shí)發(fā)送短信等。定時(shí)任務(wù)分為單機(jī)定時(shí)任務(wù)和分布式調(diào)度任務(wù)。Timer、SpringTask、ScheduledExcetorService 等均屬于單機(jī)定時(shí)任務(wù),單機(jī)定時(shí)任務(wù)操作簡(jiǎn)單,容易實(shí)現(xiàn),但存在與業(yè)務(wù)邏輯緊耦合、不支持分片任務(wù)、任務(wù)失敗無(wú)報(bào)警機(jī)制,集群化部署難以保證任務(wù)的冪等性等缺陷[1]。分布式定時(shí)任務(wù)具備支持動(dòng)態(tài)配置定時(shí)規(guī)則,集群化部署可以保證job冪等性等優(yōu)勢(shì)。XXLJOB作為一種分布式定時(shí)框架,具備可視化管理,配置靈活,可拓展性高等特性。
1 定時(shí)任務(wù)框架性能對(duì)比
1.1 XXL-JOB簡(jiǎn)介
XXL-JOB將調(diào)度行為抽象成一個(gè)不承擔(dān)業(yè)務(wù)邏輯的調(diào)度中心公共平臺(tái),平臺(tái)負(fù)責(zé)集中管理調(diào)度信息,依據(jù)調(diào)度配置進(jìn)行調(diào)度請(qǐng)求,支持界面化動(dòng)態(tài)配置任務(wù)報(bào)警、任務(wù)新建、任務(wù)修改、任務(wù)刪除等管理信息,配置完成即刻生效。XXL-JOB通過(guò)執(zhí)行器統(tǒng)一管理拆分的多個(gè)JobHandler[2],依據(jù)接收到的調(diào)度請(qǐng)求,處理相應(yīng)JobHandler中的業(yè)務(wù)模塊。這種將調(diào)度中心和執(zhí)行器分離的分布式定時(shí)框架實(shí)現(xiàn)了業(yè)務(wù)邏輯的解耦,提高了項(xiàng)目運(yùn)行的穩(wěn)定性,程序代碼的可重用性以及系統(tǒng)的可擴(kuò)展性。
1.2 Elastic-JOB簡(jiǎn)介
Elastic-JOB[3]是當(dāng)當(dāng)網(wǎng)推出的分布式任務(wù)調(diào)度框架,由Elastic-Job-Lite 和Elastic-Job-Cloud 兩個(gè)相對(duì)獨(dú)立的子項(xiàng)目組成。主要的設(shè)計(jì)理念是無(wú)中心化的分布式定時(shí)調(diào)度框架。它采用Zookeeper實(shí)現(xiàn)分布式協(xié)調(diào),任務(wù)高可用以及分片,具備彈性擴(kuò)容縮容,定制化流程型任務(wù)等功能。
1.3 Quartz簡(jiǎn)介
Quartz是由OpenSymphony組織開(kāi)發(fā)出來(lái)的開(kāi)源且具有豐富特性的任務(wù)調(diào)度庫(kù),主要由Job Detail、Job、Scheduler、Trigger四個(gè)核心類(lèi)構(gòu)成[4]。Quartz能創(chuàng)建亦簡(jiǎn)單亦復(fù)雜的調(diào)度,具備強(qiáng)大的調(diào)度功能與靈活的應(yīng)用方式,但存在時(shí)間規(guī)則更改無(wú)法實(shí)時(shí)生效,沒(méi)有可視化管理界面等缺陷。
上述三種分布式定時(shí)任務(wù)框架的性能對(duì)比如表1 所示。
2 XXL-JOB 工作原理
2.1 執(zhí)行器注冊(cè)
任務(wù)執(zhí)行器根據(jù)配置的調(diào)度中心的地址,啟動(dòng)注冊(cè)線(xiàn)程向調(diào)度中心的執(zhí)行器管理發(fā)起自動(dòng)注冊(cè)。也可以人工手動(dòng)錄入執(zhí)行器的地址信息,多地址逗號(hào)分隔,供調(diào)度中心發(fā)起注冊(cè)。
2.2 任務(wù)下發(fā)
執(zhí)行器管理中保存著注冊(cè)執(zhí)行器,后續(xù)會(huì)根據(jù)這個(gè)注冊(cè)信息給執(zhí)行器下發(fā)任務(wù)。如果此時(shí)有需要執(zhí)行的任務(wù),任務(wù)管理模塊會(huì)根據(jù)執(zhí)行器管理中注冊(cè)的執(zhí)行器信息,向任務(wù)執(zhí)行器下發(fā)任務(wù)。任務(wù)執(zhí)行器中的任務(wù)執(zhí)行服務(wù)接受到任務(wù)以后會(huì)將任務(wù)發(fā)送到待執(zhí)行任務(wù)的隊(duì)列中,隊(duì)列中的任務(wù)會(huì)由執(zhí)行線(xiàn)程Job?Handler依次獲取并且執(zhí)行。這里會(huì)維護(hù)一個(gè)任務(wù)執(zhí)行的線(xiàn)程池,池中就是一個(gè)個(gè)JobHandler線(xiàn)程,它們是執(zhí)行任務(wù)的主力軍。
2.3 執(zhí)行結(jié)果異步上報(bào)
JobHandler執(zhí)行器基于線(xiàn)程池執(zhí)行任務(wù),并把執(zhí)行結(jié)果放入執(zhí)行結(jié)果隊(duì)列中,同時(shí)會(huì)把執(zhí)行日志寫(xiě)入任務(wù)日志文件中,以供日志查詢(xún)。然后通知回調(diào)線(xiàn)程,告知任務(wù)執(zhí)行完畢,回調(diào)線(xiàn)程會(huì)通知調(diào)度中心的監(jiān)控運(yùn)維模塊,任務(wù)執(zhí)行完畢。
2.4 日志查詢(xún)請(qǐng)求
用戶(hù)可以在調(diào)度中心查看任務(wù)日志,其過(guò)程是通過(guò)發(fā)送日志查詢(xún)請(qǐng)求給任務(wù)執(zhí)行器中的日志服務(wù),然后查詢(xún)?nèi)蝿?wù)日志文件實(shí)現(xiàn)。在任務(wù)日志界面中,可查看該任務(wù)的歷史調(diào)度信息、執(zhí)行參數(shù)和執(zhí)行信息,進(jìn)入日志控制臺(tái)可查看實(shí)時(shí)執(zhí)行日志[5]。
XXL-JOB具體任務(wù)執(zhí)行流程如圖1所示。
3 平臺(tái)設(shè)計(jì)與實(shí)現(xiàn)
3.1 項(xiàng)目功能概述
智慧文旅融合大數(shù)據(jù)平臺(tái)項(xiàng)目集成省級(jí)以下各景點(diǎn)游玩信息,包含當(dāng)?shù)靥鞖鉅顩r、景區(qū)視頻監(jiān)控、道路擁擠情況、門(mén)票售賣(mài)統(tǒng)計(jì)、景區(qū)點(diǎn)評(píng)好壞等信息,涵蓋了游前、游中、游后各項(xiàng)服務(wù)要素。平臺(tái)主要包含以下功能點(diǎn)。
1)用戶(hù)信息管理:市級(jí)管理員查看該城市下所有景點(diǎn)的相關(guān)信息,省級(jí)管理員查看該省下所有的景點(diǎn)數(shù)據(jù)。
2)監(jiān)控管理:平臺(tái)接入管轄內(nèi)所有景點(diǎn)的視頻攝像,切換景區(qū)后,可以看到該景區(qū)下所有攝像頭拍攝到的實(shí)時(shí)畫(huà)面,利于負(fù)責(zé)人實(shí)時(shí)查看景區(qū)狀況。
3)數(shù)據(jù)統(tǒng)計(jì)管理:平臺(tái)統(tǒng)計(jì)分析天氣、道路、售票、點(diǎn)評(píng)等各項(xiàng)數(shù)據(jù)狀況,通過(guò)圖表的方式進(jìn)行統(tǒng)計(jì)展示。
4)信息管理:遇到道路擁擠、天氣惡劣等異常情況會(huì)進(jìn)行預(yù)警提醒。
3.2 軟件架構(gòu)設(shè)計(jì)
平臺(tái)采用B/S架構(gòu),使用SpringBoot+Vue 前后端分離技術(shù)實(shí)現(xiàn)[6]。后端采用基于MVVM模型的Spring?Boot框架[7]集成XXL-JOB的方式定時(shí)收集目標(biāo)數(shù)據(jù),經(jīng)過(guò)邏輯處理后的數(shù)據(jù)通過(guò)MyBatis-PLUS數(shù)據(jù)持久層框架進(jìn)行保存。為了減少與MySQL關(guān)系型數(shù)據(jù)庫(kù)的交互,系統(tǒng)采用對(duì)待保存數(shù)據(jù)進(jìn)行分段處理后再批量保存的方式存儲(chǔ)數(shù)據(jù),一定程度上大大提高了執(zhí)行效率。前端使用Vue+Element-UI[8]的方式開(kāi)發(fā)管理界面,Echarts[9]組件進(jìn)行數(shù)據(jù)的圖表化展示。
3.3 開(kāi)發(fā)環(huán)境
開(kāi)發(fā)平臺(tái)借助Win10 平臺(tái),采用Visual StudioCode、IDEA、Navicat等開(kāi)發(fā)工具。編程語(yǔ)言包括Java、JavaScript、Vue、Element-UI、CSS等,Java開(kāi)發(fā)環(huán)境使用JDK8。通過(guò)Git對(duì)項(xiàng)目源代碼進(jìn)行統(tǒng)一管理,其中包括代碼分支的管理與項(xiàng)目版本迭代的控制等。
3.4 定時(shí)應(yīng)用
在智慧文旅大數(shù)據(jù)平臺(tái)項(xiàng)目中,XXL-JOB主要應(yīng)用于天氣狀況、道路擁堵、第三方評(píng)價(jià)三大模塊的數(shù)據(jù)同步統(tǒng)計(jì)中,具體概述如下。
1)天氣數(shù)據(jù)方面:天氣數(shù)據(jù)包括實(shí)時(shí)溫度、體感溫度、風(fēng)力風(fēng)向、相對(duì)濕度、大氣壓強(qiáng)、降水量、能見(jiàn)度、露點(diǎn)溫度、云量等。通過(guò)和風(fēng)天氣Api統(tǒng)計(jì)中國(guó)3000+市縣區(qū)當(dāng)日以及未來(lái)7天的天氣數(shù)據(jù)。
2)道路數(shù)據(jù)方面:通過(guò)百度地圖Api統(tǒng)計(jì)所有景區(qū)附近道路的擁堵評(píng)價(jià)、擁堵距離、擁堵趨勢(shì)等信息。
3)第三方平臺(tái)數(shù)據(jù)方面:定時(shí)拉取美團(tuán)、大眾點(diǎn)評(píng)、攜程、飛豬等第三方平臺(tái)的售票與點(diǎn)評(píng)狀況,對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析。
平臺(tái)對(duì)三大模塊中定時(shí)抽取獲得的原始數(shù)據(jù)進(jìn)行清洗,刪除不必要的臟數(shù)據(jù),修補(bǔ)并完善異常數(shù)據(jù),然后按照預(yù)先設(shè)計(jì)的規(guī)則進(jìn)行數(shù)據(jù)處理,處理完成的數(shù)據(jù)最終存儲(chǔ)至數(shù)據(jù)庫(kù)表對(duì)應(yīng)的字段中。同時(shí),平臺(tái)通過(guò)可視化界面配置任務(wù)報(bào)警機(jī)制來(lái)保證異常任務(wù)的及時(shí)處理,比如:當(dāng)定時(shí)任務(wù)執(zhí)行失敗時(shí),會(huì)給配置的郵箱發(fā)送信息,提醒負(fù)責(zé)人進(jìn)行排查處理。
3.5 分片廣播策略
XXL-JOB 具有輪詢(xún)、隨機(jī)、故障轉(zhuǎn)移、一致性HASH、分片廣播等多種路由策略。在選擇“分片廣播”路由策略的場(chǎng)景下,執(zhí)行一次任務(wù)調(diào)度可以廣播實(shí)現(xiàn)集群環(huán)境中全部的執(zhí)行器完成一次任務(wù)操作,實(shí)現(xiàn)服務(wù)資源最大限度調(diào)用,根據(jù)系統(tǒng)自動(dòng)傳播的分片參數(shù)完成業(yè)務(wù)處理。
鑒于所需統(tǒng)計(jì)的數(shù)據(jù)量較大,平臺(tái)采用分片廣播的路由策略將執(zhí)行壓力均衡分散到所有服務(wù)器節(jié)點(diǎn)。在分片定時(shí)任務(wù)邏輯里,根據(jù)獲取到的分片序號(hào)、分片總數(shù)、執(zhí)行任務(wù)節(jié)點(diǎn)數(shù)量,決策當(dāng)前節(jié)點(diǎn)是否需要執(zhí)行。具體判斷公式如式(1)所示:
其中id表示數(shù)據(jù)id,n表示總分片數(shù),i表示當(dāng)前分片數(shù)。通過(guò)數(shù)據(jù)id的值對(duì)總分片數(shù)進(jìn)行求余,求余后的數(shù)正好等于系統(tǒng)的當(dāng)前分片數(shù)的方式來(lái)巧妙地實(shí)現(xiàn)天氣、道路、第三方數(shù)據(jù)的統(tǒng)計(jì),實(shí)現(xiàn)靈活調(diào)度[1, N] 個(gè)節(jié)點(diǎn)并行執(zhí)行任務(wù)。其中分片處理的核心偽代碼如下:
3.6 部署方式
文旅項(xiàng)目采用Docker[10]集群部署的方式,部署一個(gè)調(diào)度中心,在減少數(shù)據(jù)庫(kù)壓力與保證運(yùn)行效率的情況下部署盡可能多的執(zhí)行器。這種容器化的部署具備跨平臺(tái)、成本低、集成便捷等優(yōu)勢(shì)。
4 結(jié)束語(yǔ)
筆者剖析了三種分布式任務(wù)系統(tǒng)的優(yōu)缺點(diǎn),詳細(xì)描述了XXL-JOB的工作原理,并概述了XXL-JOB在文旅大平臺(tái)項(xiàng)目中的設(shè)計(jì)與應(yīng)用。XXL-JOB分布式定時(shí)任務(wù)框架具備開(kāi)發(fā)迅速、學(xué)習(xí)簡(jiǎn)單、可視化管理界面使用便捷等優(yōu)點(diǎn),在保證穩(wěn)定運(yùn)行的情況下,大大減少了開(kāi)發(fā)人員的時(shí)間和精力。但是,在調(diào)度中心和執(zhí)行器集群數(shù)量不斷增加的場(chǎng)景下,數(shù)據(jù)庫(kù)鎖競(jìng)爭(zhēng)壓力大。因此,如何減輕DB鎖壓力將是下一步的研究方向。