ElasticJob 使用場景

ElasticJob 使用場景


使用場景介紹

Quartz 定時任務使用普遍多,其中最常見Spring-Quartz,Spring框架針對Quartz進行整合,其中核心組件包括(Scheduler、Trigger、JobDetail),可配置屬性文件、應用註解
開啓執行任務,使用簡便、易上手,適用於單點、小型企業架構,不支持負載均衡

ElasticJob 噹噹網使用的任務調度框架,支持並行調度,支持分佈式調度協調,支持彈性擴容,是一種分佈式調度解決方案

優勢如下:

  • 分佈式調度
    Elastic-Job-Lite並無作業調度中心節點,而是基於部署作業框架的程序在到達相應時間點時各自觸發調度。註冊中心僅用於作業註冊和監控信息存儲。而主作業節點僅用於處理分片和清理等功能
  • 作業高可用
    Elastic-Job-Lite提供最安全的方式執行作業。將分片總數設置爲1,並使用多於1臺的服務器執行作業,作業將會以1主n從的方式執行。一旦執行作業的服務器崩潰,等待執行的服務器將會在下次作業啓動時替補執行。開啓失效轉移功能效果更好,可以保證在本次作業執行時崩潰,備機立即啓動替補執行
  • 最大限度利用資源
    Elastic-Job-Lite也提供最靈活的方式,最大限度的提高執行作業的吞吐量。將分片項設置爲大於服務器的數量,最好是大於服務器倍數的數量,作業將會合理的利用分佈式資源,動態的分配分片項
    例如:3臺服務器,分成10片,則分片項分配結果爲服務器A=0,1,2;服務器B=3,4,5;服務器C=6,7,8,9。 如果服務器C崩潰,則分片項分配結果爲服務器A=0,1,2,3,4;服務器B=5,6,7,8,9。在不丟失分片項的情況下,最大限度的利用現有資源提高吞吐量
  • 作業類型分類
  • SimpleJob:簡單作業,只執行一次,適合小數據量的簡單單次執行。
    DataflowJob:流式作業,適合大數據量的批次執行。分爲fetchData和processData,當fetchData不爲空,會進行下一次取數,直到fetchData爲空則本次作業結束,下個觸發時間點重新開始

架構圖如下
1

使用過程

Maven
//引入elastic-job-lite核心模塊
< dependency>
< groupId>io.elasticjob</ groupId>
< artifactId>elastic-job-lite-core</ artifactId>
< version>2.0.5</ version>
</ dependency>

//使用springframework自定義命名空間時引入
< dependency>
< groupId>io.elasticjob</ groupId>
< artifactId>elastic-job-lite-spring</ artifactId>
< version>2.0.5</ version>
</ dependency>

SimpleJob Demo 如下

public class MyElasticJob implements SimpleJob {

@Override
public void execute(ShardingContext context) {
    switch (context.getShardingItem()) {
        case 0: 
            // do something by sharding item 0
            break;
        case 1: 
            // do something by sharding item 1
            break;
        case 2: 
            // do something by sharding item 2
            break;
        // case n: ...
    }
}

}

屬性配置

<?xml version="1.0" encoding="UTF-8"?>
< beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:reg="http://www.dangdang.com/schema/ddframe/reg"
    xmlns:job="http://www.dangdang.com/schema/ddframe/job"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.dangdang.com/schema/ddframe/reg
                        http://www.dangdang.com/schema/ddframe/reg/reg.xsd
                        http://www.dangdang.com/schema/ddframe/job
                        http://www.dangdang.com/schema/ddframe/job/job.xsd">
    <!--配置作業註冊中心 -->
    < reg:zookeeper id="regCenter" server-lists="地址:2181" namespace="dd-job" base-sleep-time-milliseconds="1000" max-sleep-time-milliseconds="3000" max-retries="3" />
    
    <!-- 配置作業-->
    <job:simple id="demoJob" class="Demo.MyElasticJob" registry-center-ref="regCenter" cron="0/10 * * * * ?" sharding-total-count="3" sharding-item-parameters="0=A,1=B,2=C" />
</ beans>

DataflowJob Demo如下

public class DataflowJobTest implements DataflowJob< DemoVo>{

/**
 * (非 Javadoc)
* <p>Title: fetchData</p>
* <p>Description: fetchData</p>
* @param shardingContext
* @return
* @see 
 */
@Override
public List<DemoVo> fetchData(ShardingContext shardingContext) {
     
    logger.info("@_@fetchData分片項: "+shardingContext.getShardingItem()+"線程ID: "+Thread.currentThread().getId());
    System.out.println("第"+shardingContext.getShardingItem()+"片執行!");
    TestVo jobVo = new TestVo();
     
    //sql取模
    jobVo.setShardingTotalCount(shardingContext.getShardingTotalCount());
    jobVo.setShardingItem(shardingContext.getShardingItem());
    jobVo.setBatchCount(8000);
    List<TestVo> jobVoList = jobBiz.findJobByCondition(jobVo);
    //SELECT * FROM t_job_detail_new WHERE status = 1 AND MOD(id, #{shardingTotalCount}) = #{shardingItem} Limit 0, #{batchCount}
    return jobVoList;
     
    //邏輯取模
    /*Page page = new Page();
    page.setCurrentPage(1);
    page.setPageSize(160000);
    List<DemoVo> jobVoList = jobBiz.findTestJobByPage(demoVo, page);
    List<DemoVo> jobResult = new ArrayList<DemoVo>();
    if(jobVoList != null){
        for(DemoVojobVoItem : jobVoList){
            if(Integer.parseInt(jobVoItem.getId()) % shardingContext.getShardingTotalCount() == shardingContext.getShardingItem()){
                jobResult.add(jobVoItem);
            }
        }
    }
    return jobResult;*/
}
 
/**
 * (非 Javadoc)
* <p>Title: processData</p>
* <p>Description: processData</p>
* @param shardingContext
* @param data
* @see com.dangdang.ddframe.job.api.dataflow.DataflowJob#processData(com.dangdang.ddframe.job.api.ShardingContext, java.util.List)
 */
@Override
public void processData(ShardingContext shardingContext, List<DemoVo> data) {
    logger.debug("@_@"+shardingContext.getShardingItem()+"processDataStart ===============================");
    logger.info("@_@processData分片項: "+shardingContext.getShardingItem()+"線程ID: "+Thread.currentThread().getId());
    for(DemoVo jobVo : data){
        logger.debug("@_@"+shardingContext.getShardingItem()+"processedData"+jobVo.getName());
        jobVo.setStatus(3);
        jobBiz.updateJob(jobVo);
    }
    logger.debug("@_@"+shardingContext.getShardingItem()+"processDataEnd ===============================");
}

}

參數詳解:
id:在Spring容器中的主鍵
class:作業實現類,需實現ElasticJob接口,腳本類型作業不需要配置
registry-center-ref:註冊中心Bean的引用,需引用reg:zookeeper的聲明
cron:cron表達式,用於配置作業觸發時間
sharding-total-count:分片序列號和參數用等號分隔,多個鍵值對用逗號分隔,分片序列號從0開始,不可大於或者等於作業分片總數,如:0=A,1=B,2=C
overwrite:本地配置是否可覆蓋註冊中心配置,如果可覆蓋,每次啓動作業以本地配置爲準,默認:false
job-parameter:作業自定義參數,可通過傳遞該參數爲作業調度的業務方法傳參,用於實現帶參數的作業,例如:每次獲取的數據量、作業實例從數據庫讀取的主鍵等
streaming-process:是否流式處理數據,如果流式處理數據,則fetchData不返回空結果將持續執行作業,如果非流式處理數據, 則處理數據完成後作業結束
description:作業描述信息
monitor-execution:監控作業運行時狀態,默認:true
monitor-port:作業監控端口,默認:-1(不監控)
max-time-diff-seconds:最大允許的本機與註冊中心的時間誤差秒數,默認:-1(不校驗時間誤差)
failover:是否開啓失效轉移,僅monitorExecution開啓,失效轉移纔有效,默認:false
misfire:是否開啓錯過任務重新執行,默認:true
job-sharding-strategy-class:作業分片策略實現類全路徑,默認使用平均分配策略,默認:true
disabled:作業是否禁止啓動,可用於部署作業時,先禁止啓動,部署結束後統一啓動,默認:false
jobProperties:作業訂製化屬性,目前支持job_exception_handler和executor_service_handler,用於擴展異常處理和自定義作業處理線程池
event-trace-rdb-data-source:作業事件追蹤的數據源Bean引用
0 */1 * * * ?

作者簡介:張程 技術研究

更多文章請關注微信公衆號:zachary分解獅 (frankly0423)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章