elastic-job分布式调度框架

一、elastic-job框架

基于Quartz框架、zookepper开发。

主要解决了集群下作业会多次执行、集群并不能水平扩展作业(执行效率问题)。特性如下:

  • 分布式调度协调(由zookeeper提供)
  • 弹性扩容缩容
  • 失效转移(当某节点失效后,其他节点会接管作业执行)
  • 错过执行作业重触发
  • 作业分片一致性,保证同一分片在分布式环境中仅一个实例执行(不会发生多次执行情况)
  • 丰富的作业类型(simple、dataflow)
  • spring整合及命名空间提供(SpringJobScheduler)
  • 提供运维平台(elastic-job-lite-console)

 

二、elastic-job如何使用?

需要先启动zookeeper,

1、引入依赖

        <dependency>
            <groupId>com.dangdang</groupId>
            <artifactId>elastic-job-lite-spring</artifactId>
            <version>2.1.5</version>
        </dependency>

2、两种创建作业类的方式:

2.1创建作业类实现SimpleJob接口(简单作业任务)

特点:

public class MySimpleJob implements SimpleJob {
    @Override
    public void execute(ShardingContext shardingContext) {
        int shardingItem = shardingContext.getShardingItem();//当前分片项
        String jobParameter = shardingContext.getJobParameter();//当前分片自定义的参数,例如按照类型分片(txt、jpg、pdf等)
        //这里可以根据分片的信息,去数据查询对应的数据,进行处理
        //例如按照id奇偶数去分片。或按照类型等字段分片处理数据,提高性能
        System.out.println(new Date()+":"+JSON.toJSONString(shardingContext));
    }
}

2.2或实现DataFlowJob接口(数据流作业任务)

特点:

public class MyDateFlowJob implements DataflowJob<Object> {
    @Override
    public List<Object> fetchData(ShardingContext shardingContext) {
        //当返回有数据时,则执行下边的processData方法,一直到没有数据返回(执行完了),本次作业完毕
        //等待进入下一次作业
        return null;
    }

    @Override
    public void processData(ShardingContext shardingContext, List<Object> data) {
        System.out.println(new Date()+"处理数据");
    }
}

3、创建配置类

每一步在代码里都写清楚了。

@Configuration
public class ElasticJobConfig {
    @Bean
    public SpringJobScheduler dataFlowJobScheduler(DataSource dataSource){
        //1、创建zookeeper配置(zookeeper地址,命名空间)
        ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration("localhost:2181", "elastic-job");

        //2、创建zookeeper配置中心,并初始化(根据zookeeper配置创建)
        ZookeeperRegistryCenter zookeeperRegistryCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
        zookeeperRegistryCenter.init();

        //3、创建作业配置(作业名称、cron表达式、分片数量)
        JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration.newBuilder("myDataflowJob", "0/30 * * * * ?", 5)
                .jobParameter("this jobParameter")//作业参数
                .description("这个作业是干什么的?描述一下")//作业描述
                .failover(true)//开始失效转移。当某节点挂掉之后,作业会分配到其他节点继续完成
                .shardingItemParameters("0=txt,1=jpg,2=pdf,3=word,4=excel")//分片附带的参数
                .build();

        //4、创建数据流作业配置(根据作业配置、实现了DataflowJob实现类的全限定名、是否流式处理创建)
        DataflowJobConfiguration dataflowJobConfiguration = new DataflowJobConfiguration(jobCoreConfiguration, MyDateFlowJob.class.getCanonicalName(),true);

        //5、创建精简版作业配置(根据简单作业配置创建)
        LiteJobConfiguration liteJobConfiguration = LiteJobConfiguration.newBuilder(dataflowJobConfiguration)
                .jobShardingStrategyClass("com.dangdang.ddframe.job.lite.api.strategy.impl.RotateServerByNameJobShardingStrategy")//配置作业分片策略类
                //默认elastic-job提供了三种分片策略:
                //1、AverageAllocationJobShardingStrategy 平均分配策略(默认)
                //2、OdevitySortByNameJobShardingStrategy 根据作业名hash值奇偶数升降ip分配策略
                //3、RotateServerByNameJobShardingStrategy 根据作业名hash值对服务器列表轮转分配策略
                //你还可以自定义分配策略实现JobShardingStrategy接口
                .overwrite(true)//覆盖注册中心配置。如果不覆盖,一次注册后,配置便再也不能改变了。
                .monitorPort(8889)//作业辅助监控端口。当生产环境不能连接作业监控时,可通过此端口导出日志查看。
                .build();

        //6、创建作业事件配置(可选)(根据数据源创建)
        //作用:把作业的执行过程写入数据库表中
        JobEventConfiguration jobEventConfiguration = new JobEventRdbConfiguration(dataSource);

        //7、创建Elastic监听器(可选)
        //作用:可以在作业执行的前后做某些操作
        MyDistributeOnceElasticJobListener listener = new MyDistributeOnceElasticJobListener(0,0);

        //8、创建spring作业定时器,并初始化(根据作业类的实例、zookeeper注册中心、精简版作业配置、[作业事件配置]、[elastic监听器])
        //作用:正式创建作业
        SpringJobScheduler springJobScheduler = new SpringJobScheduler(new MyDateFlowJob(), zookeeperRegistryCenter, liteJobConfiguration, jobEventConfiguration, listener);
        springJobScheduler.init();
        return springJobScheduler;
    }
}

4、配置elastic-job监听器(每次执行作业都会调用监听器中的方法)(可选)

public class MyDistributeOnceElasticJobListener extends AbstractDistributeOnceElasticJobListener {

    public MyDistributeOnceElasticJobListener(long startedTimeoutMilliseconds, long completedTimeoutMilliseconds) {
        super(startedTimeoutMilliseconds, completedTimeoutMilliseconds);
    }

    @Override
    public void doBeforeJobExecutedAtLastStarted(ShardingContexts shardingContexts) {
        System.out.println("监听器--执行之前执行的方法");
    }

    @Override
    public void doAfterJobExecutedAtLastCompleted(ShardingContexts shardingContexts) {
        System.out.println("监听器--执行之后执行的方法");
    }
}

三、elastic-job可视化控制台console如何使用?

1、下载项目:https://github.com/apache/shardingsphere-elasticjob/tree/2.1.5/elastic-job-lite,下载完成解压

2、maven package打包elastic-job-lite-console项目,之后在target目录下有一个elastic-job-lite-console-2.1.5.tar.gz文件

3、解压elastic-job-lite-console-2.1.5.tar.gz文件,进入bin目录下执行start.sh启动

4、访问http://localhost:8899/。账号密码:root/root

进入console

1、全局配置,添加zookeeper信息和mysql信息

2、作业操作:可以看到作业的信息和服务器的信息

3、作业历史:可以查看作业的执行情况

四、作业辅助端口8889如何使用?

当无法在生产环境使用zookeeper时,我们可以通过作业辅助端口,导出作业执行情况,方便debug调试。

1、需要在LiteJobConfiguration配置中打开作业辅助端口.

2、需要使用dump命令和nc命令,没有需要安装

3、执行echo dump|nc 127.0.0.1 9888 > job_debug_dump.txt  命令

猜你喜欢

转载自blog.csdn.net/sumengnan/article/details/114438556
今日推荐