20191114 分佈式job配置中心

分佈式job配置中心

相當於註冊中心,每個需要跑定時任務的微服務都需要自動或者手動註冊到上面。

管理後臺

執行器管理,任務管理,調度日誌,可以查看某個job的執行狀況。

 

多個任務Handler,配置一個端口。一個執行器中可以包含多個Handler,把當前項目註冊到分佈式job管理中心,成爲一個執行器。

1)一個項目中包含多個Handler任務;

一個執行器中可能會配置多個任務。每一個handler都是任務;每個項目都是一個執行器。

 

分佈式調度中心xxl-job——The timestamp difference between admin and executor exceeds the limit.

這是一個時鐘同步問題;調度中心和任務執行器需要時間同步,同步時間誤差需要在3分鐘內,否則拋出異常。

時區問題

任務由調度中心觸發,按照在調度中心設置任務的cron表達式觸發時,需要注意部署調度中心的機器所在的時區,按照該時區定製化cron表達式。

 

cron表達式

//整點開始執行,每小時執行一次;

@Scheduled(cron = "0 0 0/1 * * ?")

//零點開始執行,只執行一次;

@Scheduled(cron = "0 0 0 * * ?")

 

必須使用分佈式job框架配置定時任務,便於對定時任務進行管理

1、不能使用setNX處理,要不然每次停止定時job都要重新發布服務,發佈的成本太高。

2、醫生表的定時任務,一般是慢sql,現在要停掉,只能重新啓動。

 

1、定時job如何進行測試?

2、每個配置都是什麼意思?

3、啓動運行下,看看代碼會不會執行,job中有執行日誌的?

4、把執行器自動註冊到任務管理上;

安裝:

分佈式job整體使用一個數據庫,直接把所有的sql語句執行即可。

管理後臺:直接編譯admin項目,然後把jar包運行在指定的機器上就即可。

寫一下xxl-job接入文檔即可,但是要防止端口重複。

 

Cron表達式理解:時間域

1、*:表示匹配該域的任意值。假如在Minutes域使用*, 即表示每分鐘都會觸發事件。

如果想要每分鐘,每天都觸發,就使用*。

2、其七位時間域,如果只有六位,說明沒有年,倒數第二位是周;

3、/:表示起始時間開始觸發,然後每隔固定時間觸發一次。例如在Minutes域使用5/20,則意味第5分鐘開始觸發一次,然後每隔20分鐘觸發一次。. 

 

依賴包

        <dependency>
            <groupId>com.corundumstudio.socketio</groupId>
            <artifactId>netty-socketio</artifactId>
            <version>1.7.17</version>
        </dependency>
        <dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.1.0</version>
        </dependency>

Job 開發與調度器配置文檔

JobHandler開發:請基於SpringBoot來開發新的JobHandler實例(定時任務處理器)。

修改配置:

修改application-xxx.properties 或 bootstrap-xxx.properties文件(注意:直接配置在項目中,不要在gitlab中配置):

下面是一個配置模板,有變動的配置項只有一項,其他配置項各個環境都一樣直接copy就好:

xxl.job.admin.addresses=http://192.168.110.124:7899/job (注意:不同環境的管理後臺地址不同)

# 控制器地址:服務啓動時,自動把當前服務自動註冊到控制器中

xxl.job.admin.addresses=http://192.168.110.124:7899/job

#執行器命名規則job-exec-<申請Port> 需要向管理員申請,防止端口重複。

xxl.job.executor.appname=job-exec-<申請Port>

xxl.job.executor.ip=

xxl.job.executor.port=<申請Port>



### xxl-job, access token 可以不用配置

xxl.job.accessToken=



### 確保改目錄可寫/opt/xxl-job-logs/jobhandler

xxl.job.executor.logpath=/opt/xxl-job-logs/jobhandler

### xxl-job log retention days

xxl.job.executor.logretentiondays=-1

生產環境,因爲要保持分佈式調度中心高可用,所以配置了兩臺機器。

 

聲明配置Bean

在項目中添加一個Configuration (JobExecutorConfiguration.java) ,讀取配置文件中的配置。

@Configuration

public class JobExecutorConfiguration {

    private Logger logger = LoggerFactory.getLogger(JobExecutorConfiguration.class);

    @Value("${xxl.job.admin.addresses}")

    private String adminAddresses;


    @Value("${xxl.job.executor.appname}")

    private String appName;


    @Value("${xxl.job.executor.ip}")

    private String ip;


    @Value("${xxl.job.executor.port}")

    private int port;


    @Value("${xxl.job.accessToken}")

    private String accessToken;


    @Value("${xxl.job.executor.logpath}")

    private String logPath;


    @Value("${xxl.job.executor.logretentiondays}")

    private int logRetentionDays;


    @Bean(initMethod = "start", destroyMethod = "destroy")

    public XxlJobSpringExecutor xxlJobExecutor() {

        logger.info("pica-job config init.");

        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();

        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);

        xxlJobSpringExecutor.setAppName(appName);

        xxlJobSpringExecutor.setIp(ip);

        xxlJobSpringExecutor.setPort(port);

        xxlJobSpringExecutor.setAccessToken(accessToken);

        xxlJobSpringExecutor.setLogPath(logPath);

        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

        return xxlJobSpringExecutor;

    }

}

JobHandler

開發JobHandler Bean,execute方法中執行業務邏輯

JobHandler必須在項目中唯一,使用Full Class name (Namespace + className)

JobHandler命名規則:

* 開發步驟:
* 1、繼承"IJobHandler",全類名“com.xxl.job.core.handler.IJobHandler”;
* 2、註冊到Spring容器:添加“@Component”註解,被Spring容器掃描爲Bean實例;
* 3、註冊到執行器工廠:添加“@JobHandler(value="自定義jobhandler名稱")”註解,註解value值對應的是調度中心新建任務的JobHandler屬性的值。
* 4、執行日誌:需要通過 "XxlJobLogger.log" 打印執行日誌;
@JobHandler(value="PingHandler")
@Component
public class PingHandler extends IJobHandler {
    @Override
    public ReturnT<String> execute(String param) throws Exception {
        XxlJobLogger.log("XXL-JOB, Hello World.");
 
        for (int i = 0; i < 5; i++) {
            XxlJobLogger.log("test14JobHandler beat at:" + i);
            TimeUnit.SECONDS.sleep(2);
        }
        return SUCCESS;
    }
}

需要注意以下幾點:

1、@JobHandler(value="PingHandler") value 與類名保持一致

2、一個類只能有一個JobHandler

通過以上三步JobHandler開發完畢。 接下來配置調度器。

 

Job 調度器管理地址

username/password: guest / 123456

dev: http://192.168.110.124:7899/job/

test1: http://192.168.110.133:7899/job/

uat: http://192.168.110.141:7899/job/

 

管理後臺配置

STEP 01:新增執行器

相同名稱的執行器被認爲是同一個執行器,執行器與JobHandler是一對多的關係,控制中心通過一個執行器調度多個JobHandler。

AppName:job-executor-${server.port} ,必須與 bootstrap-xxx.properties 配置文件中的 xxl.job.executor.appname 配置項一致。

名稱:${server.port}-exec

JobHandler 所在的服務啓動後,執行器會自動註冊到控制中心。

STEP 02:11904-exec執行器下添加JobHandler

Cron 表達式生成地址:http://cron.qqe2.com/

JobHandler來自:@JobHandler(value="PingHandler")

 

STEP 03: 任務執行與啓動

注意:STEP 02 中添加JobHandler 默認狀態爲STOP,這意味着這個Job沒有啓動,永遠也不會被執行。這裏我們需要手動啓動它,啓動後的Job狀態爲RUNNING,Job會按照Cron週期執行。

STEP04:查看Log

當前job是否成功執行。

 

 

 

什麼是任務調度?

任務調度:在單位時間內,去調用某個方法或者執行某段代碼。

實現方式:

1、使用springboot自帶的定時任務。

2、使用quartz;

以上都是可以解決任務調度的方法,但在實際項目中,一般都是使用第三方quartz實現任務調度功能,既然已經有了quartz爲什麼還需要使用xxl-job呢?

 

分佈式任務調度系統xxl-job搭建

爲解決分佈式環境下定時任務的可靠性,穩定性,只執行一次的特性,找到了個大衆點評開源的分佈式調度任務解決完整系統。

下載:https://github.com/xuxueli/xxl-job ,該項目目前更新仍然活躍,我使用的是1.9.1版本。

要新建一個定時任務,新建一個任務處理器。

只需要繼承IJobHandler,實現其方法,添加兩個註解Component和JobHandler,value=testJobHandler表示在調度中心需要配置的任務JobHandler。

 

分佈式job管理中心地址和端口

appname名字調度中心會配置,寫相同即可

# 表示此執行器地址,也就是本項目部署地址 xxl.job.executor.ip=172.16.100.141 # 提供jetty連接的端口,不要衝突即可,在調度中心會配置此項 xxl.job.executor.port=9999

 

運行報表:任務數量,調度次數(調度中心出發的調度次數),執行器數量。

執行器。在任務管理選項中添加任務。(執行器管理,任務管理)

任務執行的日誌,會打印在log面板上。

分佈式調度任務。

特徵:

動態:支持動態修改任務狀態、暫停/恢復任務,以及終止運行中任務,即時生效;

調度中心HA(中心式):調度採用中心式設計,“調度中心”基於集羣Quartz實現並支持集羣部署,可保證調度中心HA;

執行器HA(分佈式):任務分佈式執行,任務"執行器"支持集羣部署,可保證任務執行HA;

註冊中心: 執行器會週期性自動註冊任務, 調度中心將會自動發現註冊的任務並觸發執行。同時,也支持手動錄入執行器地址。

彈性擴容縮容:一旦有新執行器機器上線或者下線,下次調度時將會重新分配任務。

路由策略:執行器集羣部署時提供豐富的路由策略,包括:第一個、最後一個、輪詢、隨機、一致性HASH、最不經常使用、最近最久未使用、故障轉移、忙碌轉移等;

故障轉移:任務路由策略選擇"故障轉移"情況下,如果執行器集羣中某一臺機器故障,將會自動Failover切換到一臺正常的執行器發送調度請求。

阻塞處理策略:調度過於密集,執行器來不及處理時的處理策略,策略包括:單機串行(默認)、丟棄後續調度、覆蓋之前調度;

任務超時控制:支持自定義任務超時時間,任務運行超時將會主動中斷任務;

任務失敗重試:支持自定義任務失敗重試次數,當任務失敗時將會按照預設的失敗重試次數主動進行重試;

失敗處理策略:調度失敗時的處理策略,默認提供失敗告警、失敗重試等策略;

任務進度監控:支持實時監控任務進度;

Rolling實時日誌:支持在線查看調度結果,並且支持以Rolling方式實時查看執行器輸出的完整的執行日誌;

一致性:“調度中心”通過DB鎖保證集羣分佈式調度的一致性, 一次任務調度只會觸發一次執行;

數據加密:調度中心和執行器之間的通訊進行數據加密,提升調度信息安全性;

郵件報警:任務失敗時支持郵件報警,支持配置多郵件地址羣發報警郵件;

推送maven中央倉庫: 將會把最新穩定版推送到maven中央倉庫, 方便用戶接入和使用;

運行報表:支持實時查看運行數據,如任務數量、調度次數、執行器數量等;以及調度報表,如調度日期分佈圖,調度成功分佈圖等;

 

項目開發中,常常以下場景需要分佈式任務調度:

1、同一服務多個實例的任務存在互斥時,需要統一協調;

2、定時任務的執行需要支持高可用、監控運維、故障告警;

3、需要統一管理和追蹤各個服務節點定時任務的運行情況,以及任務屬性信息,例如任務所屬服務、所屬責任人

因此,XXL-JOB應運而生: XXL-JOB是一個開源的輕量級分佈式任務調度平臺,其核心設計目標是開發迅速、學習簡單、輕量級、易擴展、開箱即用,其中“XXL”是主要作者,大衆點評許雪裏名字的縮寫。

 

執行原理

1、任務執行器根據配置的調度中心的地址,自動註冊到調度中心

2、達到任務觸發條件,調度中心下發任務

3、執行器基於線程池執行任務,並把執行結果放入內存隊列中、把執行日誌寫入日誌文件中

4、執行器的回調線程消費內存隊列中的執行結果,主動上報給調度中心

5、當用戶在調度中心查看任務日誌,調度中心請求任務執行器,任務執行器讀取任務日誌文件並返回日誌詳情。

 

https://www.liangzl.com/get-article-detail-148205.html

 

發佈了303 篇原創文章 · 獲贊 104 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章