1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        一文讀懂分布式任務(wù)調(diào)度平臺XXL-JOB

        共 3719字,需瀏覽 8分鐘

         ·

        2020-12-30 13:45


        本文公眾號來源:分布式系統(tǒng)架構(gòu)

        作者:caison

        本文已收錄至我的GitHub


        本文主要介紹分布式任務(wù)調(diào)度平臺XXL-JOB(v2.1.0版本),包括功能特性、實現(xiàn)原理、優(yōu)缺點、同類框架比較等

        基本介紹

        項目開發(fā)中,常常以下場景需要分布式任務(wù)調(diào)度:
        • 同一服務(wù)多個實例的任務(wù)存在互斥時,需要統(tǒng)一協(xié)調(diào)


        • 定時任務(wù)的執(zhí)行需要支持高可用、監(jiān)控運維、故障告警


        • 需要統(tǒng)一管理和追蹤各個服務(wù)節(jié)點定時任務(wù)的運行情況,以及任務(wù)屬性信息,例如任務(wù)所屬服務(wù)、所屬責任人


        因此,XXL-JOB應(yīng)運而生:XXL-JOB是一個開源的輕量級分布式任務(wù)調(diào)度平臺,其核心設(shè)計目標是開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴展、開箱即用,其中“XXL”是主要作者,大眾點評許雪里名字的縮寫
        自2015年開源以來,已接入數(shù)百家公司的線上產(chǎn)品線,接入場景涉及電商業(yè)務(wù),O2O業(yè)務(wù)和大數(shù)據(jù)作業(yè)等

        功能特性

        主要功能特性如下:
        • 簡單靈活
          提供Web頁面對任務(wù)進行管理,管理系統(tǒng)支持用戶管理、權(quán)限控制;
          支持容器部署;支持通過通用HTTP提供跨平臺任務(wù)調(diào)度;

        • 豐富的任務(wù)管理功能
          支持頁面對任務(wù)CRUD操作;
          支持在頁面編寫腳本任務(wù)、命令行任務(wù)、Java代碼任務(wù)并執(zhí)行;
          支持任務(wù)級聯(lián)編排,父任務(wù)執(zhí)行結(jié)束后觸發(fā)子任務(wù)執(zhí)行;
          支持設(shè)置任務(wù)優(yōu)先級;
          支持設(shè)置指定任務(wù)執(zhí)行節(jié)點路由策略,包括輪詢、隨機、廣播、故障轉(zhuǎn)移、忙碌轉(zhuǎn)移等;
          支持Cron方式、任務(wù)依賴、調(diào)度中心API接口方式觸發(fā)任務(wù)執(zhí)行

        • 高性能
          調(diào)度中心基于線程池多線程觸發(fā)調(diào)度任務(wù),快任務(wù)、慢任務(wù)基于線程池隔離調(diào)度,提供系統(tǒng)性能和穩(wěn)定性;
          任務(wù)調(diào)度流程全異步化設(shè)計實現(xiàn),如異步調(diào)度、異步運行、異步回調(diào)等,有效對密集調(diào)度進行流量削峰;

        • 高可用
          任務(wù)調(diào)度中心、任務(wù)執(zhí)行節(jié)點均 集群部署,支持動態(tài)擴展、故障轉(zhuǎn)移
          支持任務(wù)配置路由故障轉(zhuǎn)移策略,執(zhí)行器節(jié)點不可用是自動轉(zhuǎn)移到其他節(jié)點執(zhí)行 支持任務(wù)超時控制、失敗重試配置 支持任務(wù)處理阻塞策略:調(diào)度當任務(wù)執(zhí)行節(jié)點忙碌時來不及執(zhí)行任務(wù)的處理策略,包括:串行、拋棄、覆蓋策略
        • 易于監(jiān)控運維
          支持設(shè)置任務(wù)失敗郵件告警,預(yù)留接口支持短信、釘釘告警;
          支持實時查看任務(wù)執(zhí)行運行數(shù)據(jù)統(tǒng)計圖表、任務(wù)進度監(jiān)控數(shù)據(jù)、任務(wù)完整執(zhí)行日志;

        系統(tǒng)設(shè)計

        1 設(shè)計思路

        將調(diào)度行為抽象形成“調(diào)度中心”公共平臺,而平臺自身并不承擔業(yè)務(wù)邏輯,“調(diào)度中心”負責發(fā)起調(diào)度請求;將任務(wù)抽象成分散的JobHandler,交由“執(zhí)行器”統(tǒng)一管理,“執(zhí)行器”負責接收調(diào)度請求并執(zhí)行對應(yīng)的JobHandler中業(yè)務(wù)邏輯;因此,“調(diào)度”和“任務(wù)”兩部分可以相互解耦,提高系統(tǒng)整體穩(wěn)定性和擴展性;

        2 系統(tǒng)組成

        • 調(diào)度模塊(調(diào)度中心)負責管理調(diào)度信息,按照調(diào)度配置發(fā)出調(diào)度請求,自身不承擔業(yè)務(wù)代碼。調(diào)度系統(tǒng)與任務(wù)解耦,提高了系統(tǒng)可用性和穩(wěn)定性,同時調(diào)度系統(tǒng)性能不再受限于任務(wù)模塊;支持可視化、簡單且動態(tài)的管理調(diào)度信息,包括任務(wù)新建,更新,刪除,任務(wù)報警等,所有上述操作都會實時生效,同時支持監(jiān)控調(diào)度結(jié)果以及執(zhí)行日志,支持執(zhí)行器Failover


        • 執(zhí)行模塊(執(zhí)行器)負責接收調(diào)度請求并執(zhí)行任務(wù)邏輯。任務(wù)模塊專注于任務(wù)的執(zhí)行等操作,開發(fā)和維護更加簡單和高效;接收“調(diào)度中心”的執(zhí)行請求、終止請求和日志請求等


        3 工作原理

        • 任務(wù)執(zhí)行器根據(jù)配置的調(diào)度中心的地址,自動注冊到調(diào)度中心
        • 達到任務(wù)觸發(fā)條件,調(diào)度中心下發(fā)任務(wù)
        • 執(zhí)行器基于線程池執(zhí)行任務(wù),并把執(zhí)行結(jié)果放入內(nèi)存隊列中、把執(zhí)行日志寫入日志文件中
        • 執(zhí)行器的回調(diào)線程消費內(nèi)存隊列中的執(zhí)行結(jié)果,主動上報給調(diào)度中心
        • 當用戶在調(diào)度中心查看任務(wù)日志,調(diào)度中心請求任務(wù)執(zhí)行器,任務(wù)執(zhí)行器讀取任務(wù)日志文件并返回日志詳情

        4 HA設(shè)計

        4.1 調(diào)度中心高可用

        調(diào)度中心支持多節(jié)點部署,基于數(shù)據(jù)庫行鎖保證同時只有一個調(diào)度中心節(jié)點觸發(fā)任務(wù)調(diào)度,參考com.xxl.job.admin.core.thread.JobScheduleHelper#start
        1. Connection conn = XxlJobAdminConfig.getAdminConfig().getDataSource().getConnection();


        2. connAutoCommit = conn.getAutoCommit();


        3. conn.setAutoCommit(false);


        4. preparedStatement = conn.prepareStatement( "select * from xxl_job_lock where lock_name = 'schedule_lock' for update" );


        5. preparedStatement.execute();



        6. # 觸發(fā)任務(wù)調(diào)度



        7. # 事務(wù)提交


        8. conn.commit();


        4.2 任務(wù)調(diào)度高可用

        • 路由策略
          ?調(diào)度中心基于路由策略路由選擇一個執(zhí)行器節(jié)點執(zhí)行任務(wù),XXL-JOB提供了如下路由策略保證任務(wù)調(diào)度高可用:
          忙碌轉(zhuǎn)移策略:下發(fā)任務(wù)前向執(zhí)行器節(jié)點發(fā)起rpc心跳請求查詢是否忙碌,如果執(zhí)行器節(jié)點返回忙碌則轉(zhuǎn)移到其他執(zhí)行器節(jié)點執(zhí)行(參考 com.xxl.job.admin.core.route.strategy.ExecutorRouteBusyover)
          故障轉(zhuǎn)移策略:下發(fā)任務(wù)前向執(zhí)行器節(jié)點發(fā)起rpc心跳請求查詢是否在線,如果執(zhí)行器節(jié)點沒返回或者返回不可用則轉(zhuǎn)移到其他執(zhí)行器節(jié)點執(zhí)行 (參考com.xxl.job.admin.core.route.strategy.ExecutorRouteFailover)
        • 阻塞處理策略
          ?當執(zhí)行器節(jié)點存在多個相同任務(wù)id的任務(wù)未執(zhí)行完成,則需要基于阻塞策略對任務(wù)進行取舍:
          串行策略:默認策略,任務(wù)進行排隊、丟棄舊任務(wù)策略、丟棄新任務(wù)策略(參考:com.xxl.job.core.biz.impl.ExecutorBizImpl#run)

        同類框架比較

        使用

        1 快速上手

        具體如何快速上手使用,官方文檔:http://www.xuxueli.com/xxl-job/ 已經(jīng)介紹得比較詳細和清楚,不再贅述

        2 注意事項

        • 1 時鐘同步問?
          調(diào)度中心和任務(wù)執(zhí)行器需要時間同步,同步時間誤差需要在3分鐘內(nèi),否則拋出異常 參考:com.xxl.rpc.remoting.provider.XxlRpcProviderFactory#invokeService
        1. if (System.currentTimeMillis() - xxlRpcRequest.getCreateMillisTime() > 3*60*1000) {


        2. xxlRpcResponse.setErrorMsg("The timestamp difference between admin and executor exceeds the limit.");


        3. return xxlRpcResponse;

        4. }


        • 2 時區(qū)問題
          任務(wù)由調(diào)度中心觸發(fā),按照在調(diào)度中心設(shè)置任務(wù)的cron表達式觸發(fā)時,需要注意部署調(diào)度中心的機器所在的時區(qū),按照該時區(qū)定制化cron表達式


        • 3 任務(wù)執(zhí)行中服務(wù)宕掉問題
          調(diào)度中心完成任務(wù)下發(fā),執(zhí)行器在執(zhí)行任務(wù)的過程中,如果執(zhí)行器突然服務(wù)宕掉,會導(dǎo)致任務(wù)的執(zhí)行問題在調(diào)度中心是執(zhí)行中,調(diào)度中心并不會發(fā)起失敗重試。即使任務(wù)設(shè)置了超時時間,執(zhí)行器宕掉導(dǎo)致導(dǎo)致任務(wù)長時間未執(zhí)行完成,調(diào)度中心界面也不會看到任務(wù)超時,因為任務(wù)超時是由執(zhí)行器檢測的并上報給調(diào)度中心的
        因此遇到任務(wù)長時間未執(zhí)行完成,可以關(guān)注是否發(fā)生了執(zhí)行器突然服務(wù)宕掉
        • 4 優(yōu)雅停機問題
          執(zhí)行器執(zhí)行任務(wù)基于線程池異步執(zhí)行,當需要重啟時需要注意線程池中還有未執(zhí)行完成任務(wù)的問題,需要優(yōu)雅停機,可以直接基于XxlJobExecutor.destroy()優(yōu)雅停機,注意該方法在v2.0.2之前的版本存在bug導(dǎo)致無法優(yōu)雅停機,v2.0.2及之后的版本才修復(fù)(參考:https://github.com/xuxueli/xxl-job/issues/727)


        • 5 失敗重試問題
          當執(zhí)行器節(jié)點部分服務(wù)不可用,例如節(jié)點磁盤損壞,但在調(diào)度中心仍然處于在線時,調(diào)度中心仍可能基于路由策略(包括故障轉(zhuǎn)移策略)路由到該未下線的節(jié)點,并不斷重試,不斷失敗,導(dǎo)致重試次數(shù)耗盡。所以路由策略盡量不要采用固定化策略(例如固定第一個、固定最后一個策略)

        總結(jié)

        XXL-JOB上手還是比較簡單,項目源碼還是比較整潔,容易讀懂,學(xué)習(xí)之后可以更加深入理解分布式系統(tǒng)設(shè)計、網(wǎng)絡(luò)通信、多線程協(xié)同處理等知識點,推薦閱讀


        參考

        XXL-JOB github倉庫? ? ??
        https://github.com/xuxueli/xxl-job

        XXL-JOB 官方文檔? ??
        http://www.xuxueli.com/xxl-job/#/

        歡迎關(guān)注我的微信公眾號【面試造火箭】來聊聊Java面試

        添加我的微信【sanwaiyihao進一步交流和學(xué)習(xí)

        瀏覽 77
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            五月丁香色播 | 成人毛片免费视频 | 精品青青草 | 小泽玛利亚与黑人AⅤ | 香蕉依人 | 操美女91 | 美女18禁网站 | 欧美超碰在线观看 | 西西做爰免费视频 | 撸一撸在线视频 |