ElasticJob分布式定时任务框架Word文档下载推荐.docx

上传人:b****3 文档编号:18247852 上传时间:2022-12-14 格式:DOCX 页数:14 大小:606.06KB
下载 相关 举报
ElasticJob分布式定时任务框架Word文档下载推荐.docx_第1页
第1页 / 共14页
ElasticJob分布式定时任务框架Word文档下载推荐.docx_第2页
第2页 / 共14页
ElasticJob分布式定时任务框架Word文档下载推荐.docx_第3页
第3页 / 共14页
ElasticJob分布式定时任务框架Word文档下载推荐.docx_第4页
第4页 / 共14页
ElasticJob分布式定时任务框架Word文档下载推荐.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

ElasticJob分布式定时任务框架Word文档下载推荐.docx

《ElasticJob分布式定时任务框架Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ElasticJob分布式定时任务框架Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。

ElasticJob分布式定时任务框架Word文档下载推荐.docx

被错过执行的作业重触发:

自动记录错过执行的作业,并在上次作业完成后自动触发。

可参考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.

实现失效转移功能,在某台服务器执行完毕后主动抓取未分配的分片,并且在某台服务器下线后主动寻找可用的服务器执行任

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1