ElasticJob详解
来源:互联网 发布:张大奕淘宝店叫啥 编辑:程序博客网 时间:2024/06/06 03:48
console
console没有和elastic-job-lite发生直接的联系,而是借助ZK和 Elastic-job-lite联系了在一起
但是大家注意到Elastic-Job-Lite和zk怎么联系在一起的么?是的Listener
就是它。当Console增加或修改了zk上的节点时(这里指的是jobName节点下的节点和数据变动,感谢严欢欢同学指出),就会触发Listener,进而触发Job的相关的操作,如触发、暂停、恢复等等,有了这些。明白了原理,我们来看看代码,
目前提供3
种作业类型,分别是Simple
, DataFlow
和Script
。
方法参数shardingContext
包含作业配置,分片和运行时信息。可通过getShardingTotalCount()
, getShardingItems()
等方法分别获取分片总数,运行在本作业服务器的分片序列号集合等。
开发指南
代码开发
作业类型
目前提供3
种作业类型,分别是Simple
, DataFlow
和Script
。
DataFlow
类型用于处理数据流,它又提供2
种作业类型,分别是ThroughputDataFlow
和SequenceDataFlow
。需要继承相应的抽象类。
Script
类型用于处理脚本,可直接使用,无需编码。
方法参数shardingContext
包含作业配置,分片和运行时信息。可通过getShardingTotalCount()
, getShardingItems()
等方法分别获取分片总数,运行在本作业服务器的分片序列号集合等。
Simple类型作业
Simple
类型作业意为简单实现,未经任何封装的类型。需要继承AbstractSimpleElasticJob
,该类只提供了一个方法用于覆盖,此方法将被定时执行。用于执行普通的定时任务,与Quartz
原生接口相似,只是增加了弹性扩缩容和分片等功能。
ThroughputDataFlow类型作业
ThroughputDataFlow
类型作业意为高吞吐的数据流作业。需要继承AbstractIndividualThroughputDataFlowElasticJob
并可以指定返回值泛型,该类提供3
个方法可覆盖,分别用于抓取数据,处理数据和指定是否流式处理数据。可以获取数据处理成功失败次数等辅助监控信息。如果流式处理数据,fetchData
方法的返回值只有为null
或长度为空时,作业才会停止执行,否则作业会一直运行下去;非流式处理数据则只会在每次作业执行过程中执行一次fetchData
方法和processData
方法,即完成本次作业。流式数据处理参照TbSchedule
设计,适用于不间歇的数据处理。
作业执行时会将fetchData
的数据传递给processData
处理,其中processData
得到的数据是通过多线程(线程池大小可配)拆分的。如果采用流式作业处理方式,建议processData
处理数据后更新其状态,避免fetchData
再次抓取到,从而使得作业永远不会停止。processData
的返回值用于表示数据是否处理成功,抛出异常或者返回false
将会在统计信息中归入失败次数,返回true
则归入成功次数。
SequenceDataFlow类型作业
SequenceDataFlow
类型作业和ThroughputDataFlow
作业类型极为相似,所不同的是ThroughputDataFlow
作业类型可以将获取到的数据多线程处理,但不会保证多线程处理数据的顺序。如:从2
个分片共获取到100
条数据,第1
个分片40
条,第2
个分片60
条,配置为两个线程处理,则第1
个线程处理前50
条数据,第2
个线程处理后50
条数据,无视分片项;SequenceDataFlow
类型作业则根据当前服务器所分配的分片项数量进行多线程处理,每个分片项使用同一线程处理,防止了同一分片的数据被多线程处理,从而导致的顺序问题。如:从2
个分片共获取到100
条数据,第1
个分片40
条,第2
个分片60
条,则系统自动分配两个线程处理,第1
个线程处理第1
个分片的40
条数据,第2
个线程处理第2
个分片的60
条数据。由于ThroughputDataFlow
作业可以使用多于分片项的任意线程数处理,所以性能调优的可能会优于SequenceDataFlow
作业。
Script类型作业
Script
类型作业意为脚本类型作业,支持shell
,Python
,perl
等所有类型脚本。只需通过控制台/代码配置scriptCommandLine即可。执行脚本路径可以包含参数,最后一个参数为作业运行时信息.
作业运行时输出
sharding execution context is {"shardingItems":[0,1,2,3,4,5,6,7,8,9],"shardingItemParameters":{},"offsets":{},"jobName":"scriptElasticDemoJob","shardingTotalCount":10,"jobParameter":"","monitorExecution":true,"fetchDataCount":1}
批量处理
为了提高数据处理效率,数据流类型作业提供了批量处理数据的功能。之前逐条处理数据的两个抽象类分别是AbstractIndividualThroughputDataFlowElasticJob
和AbstractIndividualSequenceDataFlowElasticJob
,批量处理则使用另外两个接口AbstractBatchThroughputDataFlowElasticJob
和AbstractBatchSequenceDataFlowElasticJob
。不同之处在于processData
方法的返回值从boolean
类型变为int
类型,用于表示一批数据处理的成功数量,第二个入参则转变为List
数据集合。
异常处理
elastic-job
在最上层接口提供了handleJobExecutionException
方法,使用作业时可以覆盖此方法,并使用quartz
提供的JobExecutionException
控制异常后作业的声明周期。默认实现是直接将异常抛出。示例:
任务监听配置
可以通过配置多个任务监听器,在任务执行前和执行后执行监听的方法。监听器分为每台作业节点均执行和分布式场景中仅单一节点执行两种。
每台作业节点均执行的监听
若作业处理作业服务器的文件,处理完成后删除文件,可考虑使用每个节点均执行清理任务。此类型任务实现简单,且无需考虑全局分布式任务是否完成,请尽量使用此类型监听器。
步骤:
- 定义监听器
- 将监听器作为参数传入
JobScheduler
分布式场景中仅单一节点执行的监听
若作业处理数据库数据,处理完成后只需一个节点完成数据清理任务即可。此类型任务处理复杂,需同步分布式环境下作业的状态同步,提供了超时设置来避免作业不同步导致的死锁,请谨慎使用。
步骤:
- 定义监听器
- 将监听器作为参数传入
JobScheduler
作业配置
与Spring
容器配合使用作业,可以将作业Bean
配置为Spring Bean
,可在作业中通过依赖注入使用Spring
容器管理的数据源等对象。可用placeholder
占位符从属性文件中取值。
Spring命名空间配置
job:simple命名空间属性详细说明
是
作业名称classString否 作业实现类,需实现ElasticJob
接口,脚本型作业不需要配置registry-center-refString是
注册中心Bean
的引用,需引用reg:zookeeper
的声明cronString是
cron
表达式,用于配置作业触发时间sharding-total-countint是
作业分片总数sharding-item-parametersString否 分片序列号和参数用等号分隔,多个键值对用逗号分隔分片序列号从
0
开始,不可大于或等于作业分片总数如:
0=a,1=b,2=c
job-parameterString否 作业自定义参数可以配置多个相同的作业,但是用不同的参数作为不同的调度实例monitor-executionboolean否true监控作业运行时状态
每次作业执行时间和间隔时间均非常短的情况,建议不监控作业运行时状态以提升效率。因为是瞬时状态,所以无必要监控。请用户自行增加数据堆积监控。并且不能保证数据重复选取,应在作业中实现幂等性。
每次作业执行时间和间隔时间均较长的情况,建议监控作业运行时状态,可保证数据不会重复选取。monitor-portint否-1作业监控端口
建议配置作业监控端口, 方便开发者dump作业信息。
使用方法: echo “dump” | nc 127.0.0.1 9888max-time-diff-secondsint否-1最大允许的本机与注册中心的时间误差秒数
如果时间误差超过配置秒数则作业启动时将抛异常
配置为
-1
表示不校验时间误差failoverboolean否false是否开启失效转移仅
monitorExecution
开启,失效转移才有效misfireboolean否true是否开启错过任务重新执行job-sharding-strategy-classString否true作业分片策略实现类全路径默认使用平均分配策略
详情参见:作业分片策略descriptionString否 作业描述信息disabledboolean否false作业是否禁止启动
可用于部署作业时,先禁止启动,部署结束后统一启动overwriteboolean否false本地配置是否可覆盖注册中心配置
如果可覆盖,每次启动作业都以本地配置为准
job:dataflow命名空间属性详细说明
job:dataflow命名空间拥有job:simple命名空间的全部属性,以下仅列出特有属性
单位:秒concurrent-data-process-thread-countint否CPU核数*2同时处理数据的并发线程数
不能小于1
仅
ThroughputDataFlow
作业有效fetch-data-countint否1每次抓取的数据量streaming-processboolean否false是否流式处理数据如果流式处理数据, 则
fetchData
不返回空结果将持续执行作业如果非流式处理数据, 则处理数据完成后作业结束
job:script命名空间属性详细说明,基本属性参照job:simple命名空间属性详细说明
job:script命名空间拥有job:simple命名空间的全部属性,以下仅列出特有属性
job:listener命名空间属性详细说明
job:listener
必须配置为job:bean
的子元素
是
前置后置任务监听实现类,需实现ElasticJobListener
接口started-timeout-millisecondslong否
Long.MAX_VALUEAbstractDistributeOnceElasticJobListener型监听器,最后一个作业执行前的执行方法的超时时间单位:毫秒completed-timeout-millisecondslong
否
Long.MAX_VALUEAbstractDistributeOnceElasticJobListener型监听器,最后一个作业执行后的执行方法的超时时间单位:毫秒
reg:bean命名空间属性详细说明
是
注册中心在Spring
容器中的主键server-listsString是
连接Zookeeper
服务器的列表包括IP地址和端口号
多个地址用逗号分隔
如: host1:2181,host2:2181namespaceString
是
Zookeeper
的命名空间base-sleep-time-millisecondsint否1000等待重试的间隔时间的初始值单位:毫秒max-sleep-time-millisecondsint否3000等待重试的间隔时间的最大值
单位:毫秒max-retriesint否3最大重试次数session-timeout-millisecondsint否60000会话超时时间
单位:毫秒connection-timeout-millisecondsint否15000连接超时时间
单位:毫秒digestString否无验证连接
Zookeeper
的权限令牌缺省为不需要权限验证
不使用Spring配置
如果不使用Spring框架,可以用如下方式启动作业。
- ElasticJob详解
- ElasticJob使用案例
- SpringBoot中使用ElasticJob
- elasticJob分片跑批
- elasticjob遇到问题总结
- elasticjob分布式任务调度中间件
- ElasticJob引发的Tomcat内存泄漏问题
- elasticjob接入方式和管理端使用
- Spring整合ElasticJob 关闭Tomcat容器时内存泄漏
- 详解
- 详解
- 详解
- 详解
- &,&&,|,||详解
- 详解
- Scala详解--------基础知识详解
- Spring详解-----------事务详解
- github 详解详解
- QT5 读取中文文件&设置中文标题
- sqlserver2008压缩日志文件语句
- 【Redis笔记-3】Redis数据类型
- el表达式获取list数据报错:java.lang.NumberFormatException: For input string: "xxx"
- ffmpeg常用命令
- ElasticJob详解
- leetcode-491. Increasing Subsequences
- 线程本地存储实例
- 系统权限的表的创建(基础版)
- 开发者论坛一周精粹(第六期)
- Android Stuido 中 Error:'app:transformClassesWithDexForDebug'. > Unable to pre-dex 的解决方法
- 解决eclipse项目运行内存溢出问题
- Unity onApplicationPause 回调失败
- Azure IoT 技术研究系列1