分布式作业 Elastic-Job 快速上手指南,从理论到实战一文搞定!

Elastic-Job支持 JAVA API 和 Spring 配置两种方式配置任务,这里我们使用 JAVA API 的形式来创建一个简单的任务入门,现在都是 Spring Boot 时代了,所以不建议使用 Spring 配置文件的形式。

Elastic-Job 需要依赖 Zookeeper 中间件,用于注册和协调作业分布式行为的组件,目前仅支持 Zookeeper。我们已经创建了 Zookeeper 集群!

环境要求

1、Java 请使用 JDK 1.7 及其以上版本。

2、Zookeeper 请使用 Zookeeper 3.4.6 及其以上版本。

3、Maven 请使用 Maven 3.0.4 及其以上版本。

引入maven依赖
<dependency>
    <groupId>com.dangdang</groupId>
    <artifactId>elastic-job-lite-core</artifactId>
    <version>2.1.5</version>
</dependency>

这里有一个坑,这个依赖里面会包含有两个不同版本的 curator-client,导致调用里面方法的时候会找不到方法,所以需要单独引入 curator-client 的依赖包。

<dependency>
	<groupId>org.apache.curator</groupId>
	<artifactId>curator-client</artifactId>
	<version>2.11.1</version>
</dependency>
创建作业

Elastic-Job 提供 Simple、Dataflow 和 Script 3种作业类型。

方法参数 shardingContext 包含作业配置、片和运行时信息。可通过 getShardingTotalCount(), getShardingItem() 等方法分别获取分片总数,运行在本作业服务器的分片序列号等。

这里我们创建一个简单(Simple)作业。

public class MyElasticJob implements SimpleJob {

	@Override
	public void execute(ShardingContext context) {
		switch (context.getShardingItem()) {
			case 0: {
				System.out.println("MyElasticJob - 0");
				break;
			}
			case 1: {
				System.out.println("MyElasticJob - 1");
				break;
			}
			case 2: {
				System.out.println("MyElasticJob - 2");
				break;
			}
			default: {
				System.out.println("MyElasticJob - default");
			}
		}
	}
}

上面的0-2涉及分布式作业框架中分片的概念

任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的服务器分别执行某一个或几个分片项。

例如:有一个遍历数据库某张表的作业,现有2台服务器。为了快速的执行作业,那么每台服务器应执行作业的50%。为满足此需求,可将作业分成2片,每台服务器执行1片。作业遍历数据的逻辑应为:服务器A遍历ID以奇数结尾的数据;服务器B遍历ID以偶数结尾的数据。如果分成10片,则作业遍历数据的逻辑应为:每片分到的分片项应为ID%10,而服务器A被分配到分片项0,1,2,3,4;服务器B被分配到分片项5,6,7,8,9,直接的结果就是服务器A遍历ID以0-4结尾的数据;服务器B遍历ID以5-9结尾的数据。

作业分片策略:http://elasticjob.io/docs/elastic-job-lite/02-guide/job-sharding-strategy/

配置作业

Elastic-Job 配置分为3个层级,分别是 Core, Type 和 Root,每个层级使用相似于装饰者模式的方式装配。

Core 对应 JobCoreConfiguration,用于提供作业核心配置信息,如:作业名称、分片总数、CRON表达式等。

Type 对应 JobTypeConfiguration,有3个子类分别对应 SIMPLE, DATAFLOW 和 SCRIPT 类型作业,提供3种作业需要的不同配置,如:DATAFLOW 类型是否流式处理或 SCRIPT 类型的命令行等。

Root 对应 JobRootConfiguration,有2个子类分别对应 Lite 和 Cloud 部署类型,提供不同部署类型所需的配置,如:Lite类型的是否需要覆盖本地配置或 Cloud 占用 CPU 或 Memory 数量等。

在 Spring Boot 启动类里面加作业配置代码。

private static CoordinatorRegistryCenter createRegistryCenter() {
    CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(new ZookeeperConfiguration("192.168.10.31:2181,192.168.10.32:2181,192.168.10.33:2181", "elastic-job-demo"));
    regCenter.init();
    return regCenter;
}

private static LiteJobConfiguration createJobConfiguration() {
    // 定义作业核心配置
    JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder("demoSimpleJob", "0/15 * * * * ?", 10).build();
    
    // 定义SIMPLE类型配置
    SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, MyElasticJob.class.getCanonicalName());
    
    // 定义Lite作业根配置
    LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).build();
}

@Bean
public CommandLineRunner commandLineRunner() {
	return (String... args) -> {
		new JobScheduler(createRegistryCenter(), createJobConfiguration()).init();
	};
}

SimpleJobConfiguration 实现了JobTypeConfiguration接口。

LiteJobConfiguration 实现了JobRootConfiguration接口。

使用CommandLineRunner,可以等 Spring Boot 启动后再启动 Elastic-Job 作业。

其他的最基础的 Spring Boot 的配置就不说了,不懂的可以去公众号菜单 Spring Boot 专题中学习。

更多作业的配置请参考官方文档:http://elasticjob.io/docs/elastic-job-lite/02-guide/config-manual/

启动作业

在工具里面使用 maven 命令 spring-boot:run 启动即可。

程序输出:

MyElasticJob - 0
MyElasticJob - 1
MyElasticJob - 2
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default

由于是单个实例,所有 10 个分片都在一个实例输出来了,现在我们把它打成 jar 包,然后再用另外一个端口启动看下是否分片成功。

两边分别输出:

MyElasticJob - 0
MyElasticJob - 1
MyElasticJob - 2
MyElasticJob - default
MyElasticJob - default

MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default
MyElasticJob - default

上面的输出信息说明分片成功了,然后停掉一个项目后发现又自动触发分片,所有的都在同一个输出来了。

可以看出分片功能真的非常实用,作业开发起来真的很方便,整个架构也很清晰,推荐大家使用。

后面还更多的 Elastic-Job 实战干货请继续关注,觉得有用就动手分享鼓励一下我们吧!

推荐:Spring Boot & Cloud 最强技术教程

扫描关注我们的微信公众号,干货每天更新。

image

转载于:https://my.oschina.net/javaroad/blog/1816683

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elastic-Job是ddframe中dd-job作业模块中分离出来的分布式弹性作业框架。去掉了和dd-job中的监控和ddframe接入规范部分。该项目基于成熟的开源产品Quartz和Zookeeper及其客户端Curator进行二次开发。       ddframe其他模块也有可独立开源的部分,之前当当曾开源过dd-soa的基石模块DubboX。elastic-job和ddframe关系见下图Elastic-Job 主要功能定时任务: 基于成熟的定时任务作业框架Quartz cron表达式执行定时任务。作业注册中心: 基于Zookeeper和其客户端Curator实现的全局作业注册控制中心。用于注册,控制和协调分布式作业执行。作业分片: 将一个任务分片成为多个小任务项在多服务器上同时执行。弹性扩容缩容: 运行中的作业服务器崩溃,或新增加n台作业服务器,作业框架将在下次作业执行前重新分片,不影响当前作业执行。支持多种作业执行模式: 支持OneOff,Perpetual和SequencePerpetual三种作业模式。失效转移: 运行中的作业服务器崩溃不会导致重新分片,只会在下次作业启动时分片。启用失效转移功能可以在本次作业执行过程中,监测其他作业服务器空闲,抓取未完成的孤儿分片项执行。运行时状态收集: 监控作业运行时状态,统计最近一段时间处理的数据成功和失败数量,记录作业上次运行开始时间,结束时间和下次运行时间。作业停止,恢复和禁用:用于操作作业启停,并可以禁止某作业运行(上线时常用)。被错过执行的作业重触发:自动记录错过执行的作业,并在上次作业完成后自动触发。可参考Quartz的misfire。多线程快速处理数据:使用多线程处理抓取到的数据,提升吞吐量。幂等性:重复作业任务项判定,不重复执行已运行的作业任务项。由于开启幂等性需要监听作业运行状态,对瞬时反复运行的作业对性能有较大影响。容错处理:作业服务器与Zookeeper服务器通信失败则立即停止作业运行,防止作业注册中心将失效的分片分项配给其他作业服务器,而当前作业服务器仍在执行任务,导致重复执行。Spring支持:支持spring容器,自定义命名空间,支持占位符。运维平台:提供运维界面,可以管理作业和注册中心。相关文档下载Release Notes1.0.2接口变更声明何为分布式作业?目录结构说明使用步骤开发指使用限制运维平台阅读源码编译问题说明实现原理作业分片策略监控快速上手(感谢第三方志愿者 泽伟@心探索科技 提供文档)InfoQ新闻Elastic-Job Wiki (由社区志愿者自由编辑的) 标签:作业调度

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值