3千字帶你搞懂XXL-JOB任務調度平臺

2020-12-17 阿里云云棲號

思維導圖

文章已收錄Github精選,歡迎Star:https://github.com/yehongzhi/learningSummary

一、概述

在平時的業務場景中,經常有一些場景需要使用定時任務,比如:

時間驅動的場景:某個時間點發送優惠券,發送簡訊等等。批量處理數據:批量統計上個月的帳單,統計上個月銷售數據等等。固定頻率的場景:每隔5分鐘需要執行一次。所以定時任務在平時開發中並不少見,而且對於現在快速消費的時代,每天都需要發送各種推送,消息都需要依賴定時任務去完成,應用非常廣泛。

二、為什麼需要任務調度平臺

在Java中,傳統的定時任務實現方案,比如Timer,Quartz等都或多或少存在一些問題:

不支持集群、不支持統計、沒有管理平臺、沒有失敗報警、沒有監控等等而且在現在分布式的架構中,有一些場景需要分布式任務調度:

同一個服務多個實例的任務存在互斥時,需要統一的調度。任務調度需要支持高可用、監控、故障告警。需要統一管理和追蹤各個服務節點任務調度的結果,需要記錄保存任務屬性信息等。顯然傳統的定時任務已經不滿足現在的分布式架構,所以需要一個分布式任務調度平臺,目前比較主流的是elasticjob和xxl-job。

elasticjob由當當網開源,目前github有6.5k的Star,使用的公司在官網登記有76家。

跟xxl-job不同的是,

elasticjob是採用zookeeper實現分布式協調

,實現任務高可用以及分片。

三、為什麼選擇XXL-JOB

實際上更多公司選擇xxl-job,目前xxl-job的github上有15.7k個star,登記公司有348個。毫無疑問elasticjob和xxl-job都是非常優秀的技術框架,接下來我們進一步對比討論,探索一下為什麼更多公司會選擇xxl-job。

首先先介紹一下xxl-job,這是出自大眾點評許雪裡(xxl就是作者名字的拼音首字母)的開源項目,官網上介紹這是一個輕量級分布式任務調度框架,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。跟elasticjob不同,xxl-job環境依賴於mysql,不用ZooKeeper,這也是最大的不同。

elasticjob的初衷是為了面對高並發複雜的業務,即使是在業務量大,伺服器多的時候也能做好任務調度,儘可能的利用伺服器的資源。使用ZooKeeper使其具有高可用、一致性的,而且還具有良好的擴展性。官網上寫

elasticjob是無中心化的,通過ZooKeeper的選舉機制選舉出主伺服器,如果主伺服器掛了,會重新選舉新的主伺服器。因此elasticjob具有良好的擴展性和可用性,但是使用和運維有一定的複雜

xxl-job則相反,是通過一個中心式的調度平臺,調度多個執行器執行任務,調度中心通過DB鎖保證集群分布式調度的一致性,這樣擴展執行器會增大DB的壓力,但是如果實際上這裡資料庫只是負責任務的調度執行。但是如果沒有大量的執行器的話和任務的情況,是不會造成資料庫壓力的。實際上大部分公司任務數,執行器並不多(雖然面試經常會問一些高並發的問題)。

相對來說,xxl-job中心式的調度平臺輕量級,開箱即用,操作簡易,上手快,與SpringBoot有非常好的集成,而且監控界面就集成在調度中心,界面又簡潔,對於企業維護起來成本不高,還有失敗的郵件告警等等。這就使很多企業選擇xxl-job做調度平臺。

四、安裝

4.1 拉取源碼

搭建xxl-job很簡單,有docker拉取鏡像部署和源碼編譯兩種方式,docker部署的方式比較簡單,我就講源碼編譯的方式。首先到github拉取xxl-job源碼到本地。

4.2 導入IDEA

拉取源碼下來後,可以看到項目結構,如下:

導入到IDEA,配置一下Maven,下載相關的jar包,稍等一下後,就可以看到這樣的項目:

4.3 初始化資料庫

前面講過xxl-job需要依賴mysql,所以需要初始化資料庫,在xxl-jobdocdb路徑下找到tables_xxl_job.sql文件。在mysql上運行sql文件。

4.4 配置文件

接著就改一下配置文件,在admin項目下找到application.properties文件。

### 調度中心JDBC連結spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaispring.datasource.username=rootspring.datasource.password=spring.datasource.driver-class-name=com.mysql.jdbc.Driver### 報警郵箱spring.mail.host=smtp.qq.comspring.mail.port=25spring.mail.username=xxx@qq.comspring.mail.password=xxxspring.mail.properties.mail.smtp.auth=truespring.mail.properties.mail.smtp.starttls.enable=truespring.mail.properties.mail.smtp.starttls.required=truespring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory### 調度中心通訊TOKEN [選填]:非空時啟用;xxl.job.accessToken=### 調度中心國際化配置 [必填]: 默認為 "zh_CN"/中文簡體, 可選範圍為 "zh_CN"/中文簡體, "zh_TC"/中文繁體 and "en"/英文;xxl.job.i18n=zh_CN## 調度線程池最大線程配置【必填】xxl.job.triggerpool.fast.max=200xxl.job.triggerpool.slow.max=100### 調度中心日誌表數據保存天數 [必填]:過期日誌自動清理;限制大於等於7時生效,否則, 如-1,關閉自動清理功能;xxl.job.logretentiondays=10

4.5 編譯運行

簡單一點直接跑admin項目的main方法啟動也行。

如果部署在伺服器呢,那我們需要打包成jar包,在IDEA利用Maven插件打包。

然後在xxl-jobxxl-job-admintarget路徑下,找到jar包。

然後就得到jar包了,使用java-jar命令就可以啟動了。

到這裡就已經完成了!打開瀏覽器,輸入

http://localhost:8080/xxl-job-admin

進入管理頁面。默認帳號/密碼:admin/123456。

五、永遠的HelloWord

部署了調度中心之後,需要往調度中心註冊執行器,添加調度任務。接下來就參考xxl-job寫一個簡單的例子。

首先創建一個SpringBoot項目,名字叫"xxljob-demo",添加依賴。

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><!-- 官網的demo是2.2.1,中央maven倉庫還沒有,所以就用2.2.0 --><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.2.0</version></dependency></dependencies>

接著修改application.properties。

# web portserver.port=8081# log configlogging.config=classpath:logback.xmlspring.application.name=xxljob-demo### 調度中心部署跟地址 [選填]:如調度中心集群部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳註冊"和"任務結果回調";為空則關閉自動註冊;xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### 執行器通訊TOKEN [選填]:非空時啟用;xxl.job.accessToken=### 執行器AppName [選填]:執行器心跳註冊分組依據;為空則關閉自動註冊xxl.job.executor.appname=xxl-job-demo### 執行器註冊 [選填]:優先使用該配置作為註冊地址,為空時使用內嵌服務 」IP:PORT「 作為註冊地址。從而更靈活的支持容器類型執行器動態IP和動態映射埠問題。xxl.job.executor.address=### 執行器IP [選填]:默認為空表示自動獲取IP,多網卡時可手動設置指定IP,該IP不會綁定Host僅作為通訊實用;地址信息用於 "執行器註冊" 和 "調度中心請求並觸發任務";xxl.job.executor.ip=### 執行器埠號 [選填]:小於等於0則自動獲取;默認埠為9999,單機部署多個執行器時,注意要配置不同執行器埠;xxl.job.executor.port=9999### 執行器運行日誌文件存儲磁碟路徑 [選填] :需要對該路徑擁有讀寫權限;為空則使用默認路徑;xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler### 執行器日誌文件保存天數 [選填] : 過期日誌自動清理, 限制值大於等於3時生效; 否則, 如-1, 關閉自動清理功能;xxl.job.executor.logretentiondays=10

接著寫一個配置類XxlJobConfig。

@ConfigurationpublicclassXxlJobConfig{ private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Value("${xxl.job.accessToken}") private String accessToken; @Value("${xxl.job.executor.appname}") private String appname; @Value("${xxl.job.executor.address}") private String address; @Value("${xxl.job.executor.ip}") private String ip; @Value("${xxl.job.executor.port}") privateint port; @Value("${xxl.job.executor.logpath}") private String logPath; @Value("${xxl.job.executor.logretentiondays}") privateint logRetentionDays; @Beanpublic XxlJobSpringExecutor xxlJobExecutor(){ logger.info(">>>>>>>>>>> xxl-job config init."); XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppname(appname); xxlJobSpringExecutor.setAddress(address); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; }}

接著編寫一個任務類XxlJobDemoHandler,使用Bean模式。

@ComponentpublicclassXxlJobDemoHandler{ /** * Bean模式,一個方法為一個任務 * 1、在Spring Bean實例中,開發Job方法,方式格式要求為 "public ReturnT<String> execute(String param)" * 2、為Job方法添加註解 "@XxlJob(value="自定義jobhandler名稱", init = "JobHandler初始化方法", destroy = "JobHandler銷毀方法")",註解value值對應的是調度中心新建任務的JobHandler屬性的值。 * 3、執行日誌:需要通過 "XxlJobLogger.log" 列印執行日誌; */@XxlJob("demoJobHandler") public ReturnT<String> demoJobHandler(String param)throws Exception { XxlJobLogger.log("java, Hello World~~~"); XxlJobLogger.log("param:" + param); return ReturnT.SUCCESS; }}

在resources目錄下,添加logback.xml文件。

<?xml version="1.0" encoding="UTF-8"?><configurationdebug="false"scan="true"scanPeriod="1 seconds"><contextName>logback</contextName><propertyname="log.path"value="/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log"/><appendername="console"class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appendername="file"class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}</file><rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern></rollingPolicy><encoder><pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n </pattern></encoder></appender><rootlevel="info"><appender-refref="console"/><appender-refref="file"/></root></configuration>

寫完之後啟動服務,然後可以打開管理界面,找到執行器管理,添加執行器。

接著到任務管理,添加任務。

最後我們可以到任務管理去測試一下,運行demoJobHandler。

點擊保存後,會立即執行。點擊查看日誌,可以看到任務執行的歷史日誌記錄。

打開剛剛執行的執行日誌,我們可以看到,運行成功。

這就是簡單的Demo演示,非常簡單,上手也快。

六、談談架構設計

下面簡單地說一下xxl-job的架構,我們先看官網提供的一張架構圖來分析。

從架構圖可以看出,分別有調度中心和執行器兩大組成部分

調度中心。負責管理調度信息,按照調度配置發出調度請求,自身不承擔業務代碼。支持可視化界面,可以在調度中心對任務進行新增,更新,刪除,會實時生效。支持監控調度結果,查看執行日誌,查看調度任務統計報表,任務失敗告警等等。執行器。負責接收調度請求,執行調度任務的業務邏輯。執行器啟動後需要註冊到調度中心。接收調度中心的發出的執行請求,終止請求,日誌請求等等。接下來我們看一下xxl-job的工作原理。

任務執行器根據配置的調度中心的地址,自動註冊到調度中心。達到任務觸發條件,調度中心下發任務。執行器基於線程池執行任務,並把執行結果放入內存隊列中、把執行日誌寫入日誌文件中。執行器的回調線程消費內存隊列中的執行結果,主動上報給調度中心。當用戶在調度中心查看任務日誌,調度中心請求任務執行器,任務執行器讀取任務日誌文件並返回日誌詳情。絮叨

看完以上的內容,基本算入門了。實際上,xxl-job還有很多功能,要深入學習,還需要到官網去研究探索。最好就是自己在本地搭建一個xxl-job來玩玩,動手實踐是學得最快的學習方式。

相關焦點

  • 3千字帶你搞懂XXL - JOB任務調度平臺
    二、為什麼需要任務調度平臺在Java中,傳統的定時任務實現方案,比如Timer,Quartz等都或多或少存在一些問題:不支持集群、不支持統計、沒有管理平臺、沒有失敗報警、沒有監控等等任務調度需要支持高可用、監控、故障告警。需要統一管理和追蹤各個服務節點任務調度的結果,需要記錄保存任務屬性信息等。顯然傳統的定時任務已經不滿足現在的分布式架構,所以需要一個分布式任務調度平臺,目前比較主流的是elasticjob和xxl-job。
  • 三千字帶你搞懂XXL-JOB任務調度平臺
    顯然傳統的定時任務已經不滿足現在的分布式架構,所以需要一個分布式任務調度平臺,目前比較主流的是elasticjob和xxl-job。則相反,是通過一個中心式的調度平臺,調度多個執行器執行任務,調度中心通過DB鎖保證集群分布式調度的一致性,這樣擴展執行器會增大DB的壓力,但是如果實際上這裡資料庫只是負責任務的調度執行。
  • Spring Boot 集成 XXL-JOB 任務調度平臺
    在開發中需要將已有的定時任務抽離出來,方便管理查看,因此選擇集成分布式任務調度平臺 XXL-JOB,本文就講解下 Spring Boot 如何集成 XXL-JOB 任務調度平臺。XXL-JOB 簡介XXL-JOB是一個分布式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。現已開放原始碼並接入多家公司線上產品線,開箱即用。
  • 企業中常用的分布式任務調度平臺XXL-JOB
    一:簡介1.1 概述XXL-JOB是一個輕量級分布式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展。import projectxxl-job 包含一些文檔和3個工程doc 文檔tablesxxljob.sqlXXL-JOB官方文檔.mdXXL-JOB架構圖.pptxxxl-job-admin:調度中心xxl-job-core:公共依賴xxl-job-executor
  • 分布式任務調度平臺-XXL-JOB實戰圖文代碼詳解
    作者:墨語前段時間項目上需要用到任務調度,對比了Quartz的不足與XXL-JOB優缺點,整體上:XXL-JOB比Quartz更輕量化,更易上手,還具有可視化界面以及在任務調度、日誌管理、彈性擴容縮容、執行器HA(分布式)、郵件報警、運行報表、全異步、跨平臺、國際化、容器化、線程池隔離等方面更加人性化。
  • 開發好物推薦6之分布式任務調度平臺xxl-job
    前言分布式開發環境中,任務調度的需求基本是必不可少的。傳統的最佳方案是Quartz。在這種背景下,需要有一個更好的平臺來克服以上缺點,xxl-job應運而生。推薦理由開發迅速、學習簡單、輕量級、易擴展。現已開放原始碼並接入多家公司線上產品線,開箱即用。
  • 比xxl-job 優秀的分布式定時任務調度框架
    簡述簡單的定時任務通過QuartZ可以實現,但隨著業務的增多,需要監控定時任務。QuartZ就無法滿足場景了。很多朋友都了解過xxl-job,這是一款非常優秀的分布式定時任務調度框架。今天給大家帶來的是另一款開源的分布式調度與計算框架。是的不僅僅是任務調度還包含計算。
  • 比xxl-job 優秀的分布式定時任務調度框架
    簡述 簡單的定時任務通過QuartZ可以實現,但隨著業務的增多,需要監控定時任務。QuartZ就無法滿足場景了。很多朋友都了解過xxl-job,這是一款非常優秀的分布式定時任務調度框架。今天給大家帶來的是另一款開源的分布式調度與計算框架。是的不僅僅是任務調度還包含計算。
  • 分布式調度系統XXL-JOB安裝和簡單使用
    /xxl-job.gitcd xxl-job/mvn -B -Dmaven.test.skip=true clean packagecd xxl-job-admin/target# 這裡 根據不同的xxl-job的版本,文件名不一樣unzip xxl-job-admin-2.3.0-SNAPSHOT.jar# 解壓之後,進入BOOT-INT/target/class/ 目錄即可看到調度中心的配置文件
  • java分布式任務調度框架分享
    Java實現定時任務有很多方式:1.JDK自帶的定時器實現,即java.util.TimerTask類;2.使用Quartz定時器來實現;3.使用spring相關的任務調度。自spring 3.0+以後,spring自帶的任務調度,主要依靠TaskScheduler接口的十幾個實現來來實現的;4.spring結合quartz實現的;5.配合linux的crontabe來實現;在這裡阿里鵬為大家介紹一個分布式任務調度框架-XXL-Job。
  • docker安裝xxl-job-admin
    1、下載鏡像docker pull xuxueli/xxl-job-admin:2.2.0初始化資料庫 Mysql腳本: https://github.com/xuxueli/xxl-job/blob/2.2.0/doc/db/tables_xxl_job.sql4、配置host
  • 一次線上 xxl-job 服務異常排查分析
    問題描述某天收到頻繁的告警郵件,定時任務調度失敗,查看 xxl-job 的執行器列表是空的,但是服務又顯示健康,查看歷史任務執行記錄發現執行器是依次遞減,由於是線上服務,只能先重啟,然後線程日誌也沒有,同事嘗試訪問服務的健康檢查接口,發現健康檢查接口訪問不通,應該是服務已經掛了
  • 這個任務調度框架太火了,你還不知道嗎?
    今天給大家新推薦一個任務調度框架,也許很多人聽過甚至目前已經使用了很久。不過沒關係,這也不影響你今天閱讀本文章。這個框架就是 XXL-JOB,一個輕量級分布式任務調度平臺。最近在我的開源項目 Kitty-Cloud 中就採用了 XXL-JOB,還有一個原因是我目前任職的公司也一直在使用 XXL-JOB。
  • 笑話:大廠都在用的任務調度框架我能不知道嗎?
    今天給大家新推薦一個任務調度框架,也許很多人聽過甚至目前已經使用了很久。不過沒關係,這也不影響你今天閱讀本文章。這個框架就是 XXL-JOB,一個輕量級分布式任務調度平臺。最近在我的開源項目 Kitty-Cloud 中就採用了 XXL-JOB,還有一個原因是我目前任職的公司也一直在使用 XXL-JOB。
  • XXL-JOB 針對未授權訪問導致遠程命令執行漏洞的聲明
    針對此問題,XXL-JOB 作者提供了以下安全防護策略:開啟 XXL-JOB 自帶的鑑權組件:官方文檔中搜索 「xxl.job.accessToken」 ,按照文檔說明啟用即可。埠防護:及時更換默認的執行器埠,不建議直接將默認的 9999 埠開放到公網。
  • PowerJob全新一代分布式調度與計算框架
    設計目標PowerJob 的設計目標為企業級的分布式任務調度平臺,即成為公司內部的任務調度中間件。整個公司統一部署調度中心 powerjob-server,旗下所有業務線應用只需要依賴 powerjob-worker 即可接入調度中心獲取任務調度與分布式計算能力。
  • 趣講 PowerJob 超強大的調度層,開始表演真正的技術了
    API 指的是通過 PowerJob 提供的客戶端接口直接啟動任務的方式,不需要 server 來支持調度,此處忽略。而剩下的 3 種調度策略,根據其執行頻率的不同,可以劃分為常規任務和秒級任務。我們先講常規任務。
  • 還在手寫任務調度代碼?試試這款可視化分布式調度框架
    在微服務系統中,經常會有用到任務調度的場景。比如每天定時同步數據、定時生成業務報表、定期清理日誌等。今天給大家推薦一個分布式調度框架,助你你輕鬆完成任務調度工作!PowerJob 簡介PowerJob是全新一代分布式調度與計算框架,能讓你輕鬆完成任務的調度與繁雜任務的分布式計算。
  • 定時任務調度框架Quartz
    同時由於一般大型項目會有多個job分別需要在不同的時間點自動執行,單線程的Timer滿足不了需求。而任務調度框架Quartz剛好滿足這些需求,我是實習公司的項目中就已經配置好了這個框架,在使用的時候了解了這個quartz,現總結如下。
  • 「微服務」 定時任務框架對比
    什麼是集群,分布式定時任務把分散的,可靠性差的計劃任務納入統一的平臺,並實現集群管理調度和分布式部署的一種定時任務的管理方式。叫做分布式定時任務。2.常見開源方案elastic-job , xxl-job ,quartz , saturn, opencron , antares, lts2.1 elastic-jobelastic-job 是由當當網基於