探索xxl-job
簡介
xxl-job是一個分布式的任務調度平臺,其核心設計目標是:學習簡單、開發迅速、輕量級、易擴展,現在已經開放源代碼并接入多家公司的線上產品線,開箱即用。xxl是xxl-job的開發者大眾點評的許雪里名稱的拼音開頭。
? xxl-job框架主要用于處理分布式的定時任務,其主要由調度中心和執行器組成。
調度模塊(調度中心):
負責管理調度信息,按照調度配置發出調度請求,自身不承擔業務代碼。調度系統與任務解耦,提高了系統可用性和穩定性,同時調度系統性能不再受限于任務模塊;
支持可視化、簡單且動態的管理調度信息,包括任務新建,更新,刪除,GLUE開發和任務報警等,所有上述操作都會實時生效,同時支持監控調度結果以及執行日志,支持執行器Failover。
執行模塊(執行器):
負責接收調度請求并執行任務邏輯。任務模塊專注于任務的執行等操作,開發和維護更加簡單和高效;
接收“調度中心”的執行請求、終止請求和日志請求等。
原理概述
1.執行器的注冊和發現
執行器的注冊和發現主要是關系兩張表:
xxl_job_registry:執行器的實例表,保存實例信息和心跳信息,xxl_job_group:每個服務注冊的實例列表。
執行器啟動線程每隔30秒向注冊表xxl_job_registry請求一次,更新執行器的心跳信息,調度中心啟動線程每隔30秒檢測一次xxl_job_registry,將超過90秒還沒有收到心跳的實例信息從xxl_job_registry刪除,并更新xxl_job_group服務的實例列表信息。
2.調度中心調用執行器
調度中心的操作:
調度中心通過循環不停的:
①關閉自動提交事務
②利用mysql的悲觀鎖,其他事務無法進入
3.讀取數據庫中的xxl_job_info:記錄定時任務的相關信息,該表中有trigger_next_time字段表示下一次任務的觸發時間。拿到距離當前時間5s內的任務列表。
①對于當前時間-任務的下一次觸發時間>5,直接調過不執行,重置trigger_next_time的時間。(超過5s)
②對于任務的下一次觸發時間<當前時間<任務的下一次觸發時間+5的任務(不超過5s的)
③對于任務的下一次觸發時間>當前時間,將其放入時間輪中,根據任務下一次觸發時間更新下下一次任務觸發時間。
4.commit提交事務,同時釋放排他鎖
執行器的操作:
①執行器接收到調度中心的調度信息,將調度信息放到對應的任務的等待隊列中
②執行器的任務處理線程從任務隊列中取出調度信息,執行業務邏輯,將結果放入一個公共的等待隊列中(每個任務都有一個單獨的處理線程和等待隊列,任務信息放入該隊列中)
③執行器有一個專門的回調線程定時批量從結果隊列中取出任務結果,并且回調告知調度中心。
路由策略
共有如下幾種路由策略,保證在分布式集群的項目中,保證同時只能有一個定時任務會被觸發:
其中,執行器的順序是執行器在注冊時的先后順序。
阻塞策略
使用xxl-job
1.準備階段:https://github.com/xuxueli/xxl-job
中心倉庫配置地址:
2.代碼下載解壓,結果如下:
文件介紹:
①doc :文檔資料
②xxl-job-admin :調度中心,項目源碼
③xxl-job-core :公共Jar依賴
④xxl-job-executor-samples :執行器,Sample示例項目
MySQL表介紹:
3.調度中心配置
調度中心配置文件地址:/xxl-job/xxl-job-admin/src/main/resources/application.properties
4.執行器配置
### 調度中心部署根地址 [選填]:如調度中心集群部署存在多個地址則用逗號分隔。執行器將會使用該地址進行"執行器心跳注冊"和"任務結果回調";為空則關閉自動注冊; 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=30執行器中的XxlJobConfig將根據配置文件中配置生成XxlJobSpringExecutor:
@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;}①Bean模式下新建任務:(bean模式:以jobHandler方式維護在執行器端;需要結合JobHandler屬性匹配執行器中的任務)
②方式模式(需要在spring的容器中開發job)
xxl-job總結
xxl-job是一個中心式分布式的調度平臺,調度中心和執行器解耦,執行器和業務代碼耦合,代碼的侵入性少,學習簡單、開發簡單、輕量級。
總結
- 上一篇: addition过程 sgnb_NSA辅
- 下一篇: 半入耳的蓝牙耳机哪个好?半入耳式蓝牙耳机