89分布式解決方案 --分布式任務調(diào)度平臺

1,傳統(tǒng)的定時任務存在哪些缺點?
1,業(yè)務邏輯與定時任務邏輯放入同一個jar包中,如果定時任務邏輯掛了也會影響到業(yè)務邏輯;
2, 如果服務器集群下,可能存在定時任務會重復觸發(fā)執(zhí)行
3,定時惹怒我執(zhí)行非常消耗cpu的資源,可能會影響到業(yè)務線程的執(zhí)行。

2,定時任務集群,如何保證定時任務冪等性問題。
1,將業(yè)務邏輯和定時任務邏輯分開部署,實現(xiàn)解耦,只對業(yè)務邏輯實現(xiàn)集群,不對我們的定時任務邏輯集群;一定時任務單機版本,缺點 無法實現(xiàn)高可用的問題;
2,對我們的jar包加上一個開關(guān),項目啟動時讀取該開關(guān),如果為true的情況下則加載定時任務類,否則情況下不加載定時任務類。 ---缺點: 無法實現(xiàn)高可用的問題。
3, 在數(shù)據(jù)庫加上一個主鍵能夠成功則觸發(fā)定時任務,否則就不觸發(fā)定時任務
4,分布式實現(xiàn),只要jar能夠拿到分布式鎖就能夠執(zhí)行定時任務,否則不執(zhí)行。

以上的方案都是屬于規(guī)模比較小的項目,在微服務架構(gòu)中應該采用分布式任務調(diào)度平臺。
傳統(tǒng)的定時任務的實現(xiàn)方案: 多線程形式,timetask,線城池,springboot 注解 quartz。
3,分布式任務調(diào)度平臺設計原理。
xxl-job-admin ---分布式任務調(diào)度中心平臺
xxl-job-core-----源碼實現(xiàn)部分
xxl-job-executor-samples----執(zhí)行器項目 定時任務模塊

定時任務與業(yè)務邏輯實現(xiàn)解耦。分開部署,定時任務是個單獨的項目

Mayikt-member---會員服務接口
member-job----負責會員服務定時任務

4,XXL-JOB 與ElasticJob 區(qū)別
5,分布式任務調(diào)度平臺如何實現(xiàn)動態(tài)啟停
6, 分布式任務調(diào)度負載均衡策略。
7,分布式任務調(diào)度分片集群策略原理
8,如何保證任務調(diào)度平臺高可用。
分布式任務調(diào)度架構(gòu)設計原理:
xxl-job-admin--分布式任務調(diào)度中心平臺:
xxl-job-core---源碼實現(xiàn)部分
執(zhí)行器模塊: (注冊中心)存放實際執(zhí)行我們定時任務項目模塊IP和端口信息
分布式任務調(diào)度中心: nginx 負責所有執(zhí)行器執(zhí)行定時任務的分配。
原理:
1,執(zhí)行器啟動的時候會將他的ip和端口號注冊到執(zhí)行器上。
2,當我們現(xiàn)在的定時任務模塊中啟動定時任務的時候,定時任務會在admin項目先觸發(fā),會根據(jù)執(zhí)行器的名稱查詢多個不同的執(zhí)行的ip信息,在采用負載均衡算法選擇一個地址,發(fā)送rest請求通知給執(zhí)行器執(zhí)行到定時任務。

XXl-job 定時任務框架實現(xiàn)原理。
建議: 定時任務業(yè)務邏輯與業(yè)務邏輯模塊實現(xiàn)分開部署。也就是實現(xiàn)解耦。
會員服務:--會員業(yè)務邏輯 不允許有定時任務邏輯。
會員定時任務模塊--執(zhí)行定時任務業(yè)務邏輯:
執(zhí)行器“: 定時業(yè)務邏輯模塊的項目:
定時任務調(diào)度中心(nginx),所有定時任務觸發(fā)先到達
定時任務調(diào)度中心,在駕駛分配到執(zhí)行器執(zhí)行。

xxl-job-admin定時任務調(diào)度中心模塊

執(zhí)行器模塊----定時任務模塊----執(zhí)行器注冊中心

原理:
1,當我們的定時任務模塊項目啟動的時候,會將該ip和端口信息注冊到 定時任務注冊中心上發(fā)送rest請求;

http://127.0.0.1:8080/xxl-job-admin/api/registry

2,需要將定時任務創(chuàng)建在任務調(diào)度中心,關(guān)聯(lián)執(zhí)行器 定時任務模塊實際執(zhí)行ip和端口號
3,創(chuàng)建定時任務會再 xxl-job admin 調(diào)度中心 項目先觸發(fā),從執(zhí)行器初測中心查找到執(zhí)行器接口信息,采用路由策略選擇一個執(zhí)行器(定時任務)地址 發(fā)送通知 執(zhí)行定時任務。配置定時任務規(guī)則的時候,建議提前些。

定時任務和業(yè)務邏輯代碼完全分開,定時任務代碼肯定單獨的一個項目;
執(zhí)行器:定時任務業(yè)務邏輯;
任務調(diào)度平臺:
核心:
定時調(diào)度模塊 所有定時任務需要經(jīng)過定時調(diào)度模塊
執(zhí)行器: 業(yè)務邏輯模塊

  1. 執(zhí)行器定時任務項目,啟動時候會將該定時任務接口地址注冊到定時任務注冊中心中
  2. 當觸發(fā)定時任務時候,會先到達任務調(diào)度中心,在獲取注冊中心地址 隨機取出一個地址實現(xiàn)rpc遠程調(diào)用。
  3. 執(zhí)行器接收到請求之后,根據(jù)handlerid +反射機制執(zhí)行方法。
    缺點:定時任務可能會延遲。

常用時任務調(diào)度框架:

Xxl-job、elasticjob、SpringAlibaba Cloud SchedulerX
XXL-JOB任務調(diào)度平臺
https://www.xuxueli.com/xxl-job/

XXL-job-Admin 平臺搭建 任務調(diào)度中心
1,官方下載XXL-JobAdmin 的源代碼
2,導入xxl-job需要依賴的sql
3,3. 在xxl-job jdb鏈接配置加上&serverTimezone=UTC 否則報錯

4,啟動項目
SpringBoot整合XXL-JOB
Maven依賴配置

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.11.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-job-core</artifactId>
        <version>2.1.2</version>
    </dependency>

</dependencies>

Xxl config

@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.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
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-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;
    }

/**
     * 針對多網(wǎng)卡、容器內(nèi)部署等情況,可借助 "spring-cloud-commons" 提供的 "InetUtils" 組件靈活定制注冊IP;
     *
     *      1、引入依賴:
     *          <dependency>
     *             <groupId>org.springframework.cloud</groupId>
     *             <artifactId>spring-cloud-commons</artifactId>
     *             <version>${version}</version>
     *         </dependency>
     *
     *      2、配置文件,或者容器啟動變量
     *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
     *
     *      3、獲取IP
     *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
     */


}

測試任務Demo

@Component
public class MyJobExecutor {
    @Value("${xxl.job.executor.port}")
    private String executorPort;

    @XxlJob("myJobHandler")
    public ReturnT<String> myJobHandler(String param) {
        System.out.println(">>>myJobHandler觸發(fā)<<<param:" + param + ",executorPort:" + executorPort);
        return ReturnT.SUCCESS;
    }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 夜鶯2517閱讀 128,133評論 1 9
  • 版本:ios 1.2.1 亮點: 1.app角標可以實時更新天氣溫度或選擇空氣質(zhì)量,建議處女座就不要選了,不然老想...
    我就是沉沉閱讀 7,419評論 1 6
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,832評論 28 54
  • 兔子雖然是枚小碩 但學校的碩士四人寢不夠 就被分到了博士樓里 兩人一間 在學校的最西邊 靠山 兔子的室友身體不好 ...
    待業(yè)的兔子閱讀 2,766評論 2 9

友情鏈接更多精彩內(nèi)容