ElasticJob分布式定时任务框架Word文档下载推荐.docx
- 文档编号:18247852
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:14
- 大小:606.06KB
ElasticJob分布式定时任务框架Word文档下载推荐.docx
《ElasticJob分布式定时任务框架Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ElasticJob分布式定时任务框架Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
被错过执行的作业重触发:
自动记录错过执行的作业,并在上次作业完成后自动触发。
可参考Quartz的misfire。
多线程快速处理数据:
使用多线程处理抓取到的数据,提升吞吐量。
幂等性:
重复作业任务项判定,不重复执行已运行的作业任务项。
由于开启幂等性需要监听作业运行状态,对瞬时反复运行的作业对性能有较大影响。
容错处理:
作业服务器与Zookeeper服务器通信失败则立即停止作业运行,防止作业注册中心将失效的分片分项配给其他作业服务器,而当前作业服务器仍在执行任务,导致重复执行。
Spring支持:
支持spring容器,自定义命名空间,支持占位符。
运维平台:
提供运维界面,可以管理作业和注册中心。
目录结构说明
elastic-job-core
elastic-job核心模块,只通过Quartz和Curator就可执行分布式作业。
elastic-job-spring
elastic-job对spring支持的模块,包括命名空间,依赖注入,占位符等。
elastic-job-console
elastic-jobweb控制台,可将编译之后的war放入tomcat等servlet容器中使用。
elastic-job-example
使用例子。
elastic-job-test
测试elastic-job使用的公用类,使用方无需关注。
引入maven依赖
elastic-job已经发布到中央仓库,可以在pom.xml文件中直接引入maven坐标。
<
!
--
引入elastic-job核心模块
-->
dependency>
groupId>
com.dangdang<
/groupId>
artifactId>
elastic-job-core<
/artifactId>
version>
1.0.1<
/version>
/dependency>
使用springframework自定义命名空间时引入
elastic-job-spring<
代码开发
提供3种作业类型,分别是OneOff,Perpetual和SequencePerpetual。
需要继承相应的抽象类。
方法参数shardingContext包含作业配置,分片和运行时信息。
可通过getShardingTotalCount(),getShardingItems()等方法分别获取分片总数,运行在本作业服务器的分片序列号集合等。
OneOff类型作业
OneOff作业类型比较简单,需要继承AbstractOneOffElasticJob,该类只提供了一个方法用于覆盖,此方法将被定时执行。
用于执行普通的定时任务,与Quartz原生接口相似,只是增加了弹性扩缩容和分片等功能。
public
class
MyElasticJob
extends
AbstractOneOffElasticJob
{
@Override
protected
void
process(JobExecutionMultipleShardingContext
context)
//
do
something
by
sharding
items
}}
Perpetual类型作业
Perpetual作业类型略为复杂,需要继承AbstractPerpetualElasticJob并可以指定返回值泛型,该类提供两个方法可覆盖,分别用于抓取和处理数据。
可以获取数据处理成功失败次数等辅助监控信息。
需要注意fetchData方法的返回值只有为null或长度为空时,作业才会停止执行,否则作业会一直运行下去。
这点是参照TbSchedule的设计。
Perpetual作业类型更适用于流式不间歇的数据处理。
作业执行时会将fetchData的数据传递给processData处理,其中processData得到的数据是通过多线程(线程池大小可配)拆分的。
建议processData处理数据后,更新其状态,避免fetchData再次抓取到,从而使得作业永远不会停止。
processData的返回值用于表示数据是否处理成功,抛出异常或者返回false将会在统计信息中归入失败次数,返回true则归入成功次数。
AbstractPerpetualElasticJob<
Foo>
List<
fetchData(JobExecutionMultipleShardingContext
result
=
get
data
from
database
return
result;
}
boolean
processData(JobExecutionMultipleShardingContext
context,
Foo
data)
process
true;
SequencePerpetual类型作业
SequencePerpetual作业类型和Perpetual作业类型极为相似,所不同的是Perpetual作业类型可以将获取到的数据多线程处理,但不会保证多线程处理数据的顺序。
如:
从2个分片共获取到100条数据,第1个分片40条,第2个分片60条,配置为两个线程处理,则第1个线程处理前50条数据,第2个线程处理后50条数据,无视分片项;
SequencePerpetual类型作业则根据当前服务器所分配的分片项数量进行多线程处理,每个分片项使用同一线程处理,防止了同一分片的数据被多线程处理,从而导致的顺序问题。
从2个分片共获取到100条数据,第1个分片40条,第2个分片60条,则系统自动分配两个线程处理,第1个线程处理第1个分片的40条数据,第2个线程处理第2个分片的60条数据。
由于Perpetual作业可以使用多余分片项的任意线程数处理,所以性能调优的可能会优于SequencePerpetual作业。
AbstractSequencePerpetualElasticJob<
fetchData(JobExecutionSingleShardingContext
processData(JobExecutionSingleShardingContext
作业配置
与Spring容器配合使用作业,可以将作业Bean配置为SpringBean,可在作业中通过依赖注入使用Spring容器管理的数据源等对象。
可用placeholder占位符从属性文件中取值。
Spring命名空间配置
?
xml
version="
1.0"
encoding="
UTF-8"
>
beans
xmlns="
http:
//www.springframework.org/schema/beans"
xmlns:
xsi="
//www.w3.org/2001/XMLSchema-instance"
reg="
job="
xsi:
schemaLocation="
//www.springframework.org/schema/beans
//www.springframework.org/schema/beans/spring-beans.xsd
"
--配置作业注册中心
reg:
zookeeper
id="
regCenter"
serverLists="
yourhost:
2181"
namespace="
dd-job"
baseSleepTimeMilliseconds="
1000"
maxSleepTimeMilliseconds="
3000"
maxRetries="
3"
/>
配置作业A-->
job:
bean
oneOffElasticJob"
class="
xxx.MyOneOffElasticJob"
regCenter="
cron="
0/10
*
shardingTotalCount="
shardingItemParameters="
0=A,1=B,2=C"
配置作业B-->
perpetualElasticJob"
xxx.MyPerpetualElasticJob"
processCountIntervalSeconds="
10"
concurrentDataProcessThreadCount="
/beans>
bean/>
命名空间属性详细说明
zookeeper/>
基于Spring但不使用命名空间
配置作业注册中心
com.dangdang.ddframe.reg.zookeeper.ZookeeperRegistryCenter"
init-method="
init"
constructor-arg>
com.dangdang.ddframe.reg.zookeeper.ZookeeperConfiguration"
property
name="
serverLists"
value="
${xxx}"
namespace"
baseSleepTimeMilliseconds"
maxSleepTimeMilliseconds"
maxRetries"
/bean>
/constructor-arg>
配置作业-->
xxxJob"
com.dangdang.ddframe.job.spring.schedule.SpringJobController"
constructor-arg
ref="
com.dangdang.ddframe.job.api.JobConfiguration"
jobName"
jobClass"
xxxDemoJob"
shardingTotalCount"
cron"
shardingItemParameters"
不使用Spring配置
如果不使用Spring框架,可以用如下方式启动作业。
import
com.dangdang.ddframe.job.api.JobConfiguration;
com.dangdang.ddframe.job.schedule.JobController;
com.dangdang.ddframe.reg.base.CoordinatorRegistryCenter;
com.dangdang.ddframe.reg.zookeeper.ZookeeperConfiguration;
com.dangdang.ddframe.reg.zookeeper.ZookeeperRegistryCenter;
com.dangdang.example.elasticjob.core.job.OneOffElasticDemoJob;
com.dangdang.example.elasticjob.core.job.PerpetualElasticDemoJob;
com.dangdang.example.elasticjob.core.job.SequencePerpetualElasticDemoJob;
JobDemo
定义Zookeeper注册中心配置对象
private
ZookeeperConfiguration
zkConfig
new
ZookeeperConfiguration("
localhost:
elastic-job-example"
1000,
3000,
3);
定义Zookeeper注册中心
CoordinatorRegistryCenter
regCenter
ZookeeperRegistryCenter(zkConfig);
定义作业1配置对象
JobConfiguration
jobConfig1
JobConfiguration("
oneOffElasticDemoJob"
OneOffElasticDemoJob.class,
10,
0/5
);
定义作业2配置对象
jobConfig2
perpetualElasticDemoJob"
PerpetualElasticDemoJob.class,
定义作业3配置对象
jobConfig3
sequencePerpetualElasticDemoJob"
SequencePerpetualElasticDemoJob.class,
static
main(final
String[]
args)
JobDemo().init();
init()
连接注册中心
regCenter.init();
启动作业1
JobController(regCenter,
jobConfig1).init();
启动作业2
jobConfig2).init();
启动作业3
jobConfig3).init();
使用限制
作业一旦启动成功后不能修改作业名称,如果修改名称则视为新的作业。
同一台作业服务器只能运行一个相同的作业实例,因为作业运行时是按照IP注册和管理的。
作业根据/etc/hosts文件获取IP地址,如果获取的IP地址是127.0.0.1而非真实IP地址,应正确配置此文件。
一旦有服务器波动,或者修改分片项,将会触发重新分片;
触发重新分片将会导致运行中的Perpetual以及SequencePerpetual作业再执行完本次作业后不再继续执行,等待分片结束后再恢复正常。
开启monitorExecution才能实现分布式作业幂等性(即不会在多个作业服务器运行同一个分片)的功能,但monitorExecution对短时间内执行的作业(如每5秒一触发)性能影响较大,建议关闭并自行实现幂等性。
elastic-job没有自动删除作业服务器的功能,因为无法区分是服务器崩溃还是正常下线。
所以如果要下线服务器,需要手工删除zookeeper中相关的服务器节点。
由于直接删除服务器节点风险较大,暂时不考虑在运维平台增加此功能
实现原理
弹性分布式实现
1.
第一台服务器上线触发主服务器选举。
主服务器一旦下线,则重新触发选举,选举过程中阻塞,只有主服务器选举完成,才会执行其他任务。
2.
3.
某作业服务器上线时会自动将服务器信息注册到注册中心,下线时会自动更新服务器状态。
4.
5.
主节点选举,服务器上下线,分片总数变更均更新重新分片标记。
6.
7.
定时任务触发时,如需重新分片,则通过主服务器分片,分片过程中阻塞,分片结束后才可执行任务。
如分片过程中主服务器下线,则先选举主服务器,再分片。
8.
9.
通过4可知,为了维持作业运行时的稳定性,运行过程中只会标记分片状态,不会重新分片。
分片仅可能发生在下次任务触发前。
10.
11.
每次分片都会按服务器IP排序,保证分片结果不会产生较大波动。
12.
13.
实现失效转移功能,在某台服务器执行完毕后主动抓取未分配的分片,并且在某台服务器下线后主动寻找可用的服务器执行任
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ElasticJob 分布式定时任务框架 分布式 定时 任务 框架