***********************************************************************************************************************************
当当开源的elastic job分布式任务调度已于202008进入Apache基金会,下面来试玩一下它的Apache版本
***********************************************************************************************************************************
单机任务调度可能存在系统性能瓶颈,应用多实例部署可能出现同一时间多个相同定时任务(虽然可分布式锁解决),试看elastic job分布式任务调度能否解决这些痛点?详细功能列表
- 分布式调度协调
- 弹性扩容缩容
- 失效转移
- 错过执行作业重触发
- 作业分片一致性,保证同一分片在分布式环境中仅一个执行实例
- 自诊断并修复分布式不稳定造成的问题
- 支持并行调度
- 支持作业生命周期操作
- 丰富的作业类型
- Spring整合以及命名空间提供
- 运维平台
基本架构
1.依赖
<dependency>
<groupId>org.apache.shardingsphere.elasticjob</groupId>
<artifactId>elasticjob-lite-spring-boot-starter</artifactId>
<version>3.0.0-alpha</version>
</dependency>
2.配置
这里配置了四个类型的job,copy于github项目examples->elasticjob-example-lite-springboot的配置文件.关于分片项参数:shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou 我的理解:0,1,2是分片索引,对应每个应用实例,value则为每个分片(每个实例)独有的参数,用于义务判断等。
elasticjob:
tracing:
type: RDB
regCenter:
serverLists: zookeeper地址 #快速安装docker run --privileged=true --name zookeeper -p 2181:2181 -d zookeeper:latest
namespace: elasticjob-lite
jobs:
simpleJob:
elasticJobClass: org.apache.shardingsphere.elasticjob.simple.job.SimpleJob
cron: 0/5 * * * * ?
shardingTotalCount: 2
shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou
dataflowJob:
elasticJobClass: org.apache.shardingsphere.elasticjob.dataflow.job.DataflowJob
cron: 0/5 * * * * ?
shardingTotalCount: 2
shardingItemParameters: 0=Beijing,1=Shanghai,2=Guangzhou
scriptJob:
elasticJobType: SCRIPT
cron: 0/10 * * * * ?
shardingTotalCount: 2
props:
script.command.line: "echo SCRIPT Job: "
manualScriptJob:
elasticJobType: SCRIPT
jobBootstrapBeanName: manualScriptJobBean
shardingTotalCount: 2
props:
script.command.line: "echo Manual SCRIPT Job: "
dump:
port: 8888
3.SimleJob /DataflowJob
@Component
@Slf4j
public class SpringBootDataflowJob implements DataflowJob<User> {
@Override
public List<User> fetchData(final ShardingContext shardingContext) {
log.info("Item: {} | Time: {} | Thread: {} | {},detail:{}",
shardingContext.getShardingItem(), new SimpleDateFormat("HH:mm:ss").format(new Date()), Thread.currentThread().getId(), "DATAFLOW FETCH",shardingContext);
return null;
}
@Override
public void processData(final ShardingContext shardingContext, final List<User> data) {
log.info("Item: {} | Time: {} | Thread: {} | {},detail:{}",
shardingContext.getShardingItem(), new SimpleDateFormat("HH:mm:ss").format(new Date()), Thread.currentThread().getId(), "DATAFLOW PROCESS",shardingContext);
}
}
@Component
@Slf4j
public class SpringBootSimpleJob implements SimpleJob {
@Override
public void execute(ShardingContext shardingContext) {
log.info("Item: {} | Time: {} | Thread: {} | {},detail:{}",
shardingContext.getShardingItem(), new SimpleDateFormat("HH:mm:ss").format(new Date()), Thread.currentThread().getId(), "SIMPLE",shardingContext);
}
}
4.基本测试
这里有个坑,本地win7启动 IpUtils类报错:ip is null ,win8 win10没测试,Linux没问题,已提issue。jar -jar 启动一个实例,可见配置的任务数2,两个shard 0,1都在执行
同一主机再启动一个实例进行,Java -jar -Dserver.port=xxxx 再启动一个实例,通过日志任务调度已重新分配
这样:beijing 和shanghai分别在两个实例。如需要把北京上海的用户遍历处理进行一些复杂业务处理,就可以将shardingParameter作为SQL参数。
//TODO 待官方修复后bug后测试其它功能