熟练使用 Elastic Job系列之作业分片策略(五)

简介: 框架默认提供了三种分片策略

自带的分片策略

框架默认提供了三种分片策略,所有的分片策略都是接口JobShardingStrategy的实现

 JobShardingStrategy(com.dangdang.ddframe.job.lite.api.strategy)
AverageAllocationJobShardingStrategy(com.dangdang.ddframejob.lite.api.strategy.impl) C:MyJobShardingStrategy(com.dangdang.ddframejob.example.config)
OdevitySortByNameJobShardingStrategy(com.dangdang.ddframejob.lite.api.strategyimpl) RotateServerByNameJobShardingStrategy(com.dangdang.ddframejob.lite.api.strategy.impl)

AverageAllocationJobShardingStrategy

全类路径:

io.elasticjob.lite.api.strategy.impl.AverageAllocationJobShardingStrategy

策略说明:

  1. 基于平均分配算法的分片策略,也是默认的分片策略。
  2. 如果分片不能整除,则不能整除的多余分片将依次追加到序号小的服务器。如:
  3. 如果有3台服务器,分成9片,则每台服务器分到的分片是:1=[0,1,2], 2=[3,4,5], 3=[6,7,8]
  4. 如果有3台服务器,分成8片,则每台服务器分到的分片是:1=[0,1,6], 2=[2,3,7], 3=[4,5]
  5. 如果有3台服务器,分成10片,则每台服务器分到的分片是:1=[0,1,2,9], 2=[3,4,5], 3=[6,7,8]

OdevitySortByNameJobShardingStrategy

全类路径:

io.elasticjob.lite.api.strategy.impl.OdevitySortByNameJobShardingStrategy

策略说明:

  1. 根据作业名的哈希值奇偶数决定IP升降序算法的分片策略。
  2. 作业名的哈希值为奇数则IP升序。
  3. 作业名的哈希值为偶数则IP降序。
  4. 用于不同的作业平均分配负载至不同的服务器。

AverageAllocationJobShardingStrategy VS OdevitySortByNameJobShardingStrategy

AverageAllocationJobShardingStrategy的缺点是,一旦分片数小于作业服务器数,作业将永远分配至IP地址靠前的服务器,导致IP地址靠后的服务器空闲。而OdevitySortByNameJobShardingStrategy则可以根据作业名称重新分配服务器负载。如:

如果有3台服务器,分成2片,作业名称的哈希值为奇数,则每台服务器分到的分片是:1=[0], 2=[1], 3=[]

如果有3台服务器,分成2片,作业名称的哈希值为偶数,则每台服务器分到的分片是:3=[0], 2=[1], 1=[]

RotateServerByNameJobShardingStrategy

全类路径:

io.elasticjob.lite.api.strategy.impl.RotateServerByNameJobShardingStrategy

策略说明: 根据作业名的哈希值对服务器列表进行轮转的分片策略。

运维平台与分片

回到熟练使用 Elastic Job系列之入门Demo(三) 文章的实例demo, 在项目中有通过sharding-total-count=来设置作业分片数, 如图所示,

ication context not configured for this file 
<? xml version -1.0 encoding - uTF -8”?>
 beans xmlns =”http://ww.springframework.org/schema/beans”
 xmlns : xsi =“ http ://ww.w3.org/2001/xMLSchena-instance"
 xmlns : reg ="http://ww.dangdang.com/schema/ddfrane/reg
 xmlns : job ="http://wm.dangdang.com/schema/ddframe/job"
 xsi : schemaLocation =“ http ://wmw.springframework.org/schema/beans
 http :// ww ,.springframework.org/schema/bean/spxing-beans.xsd
http://www.dangdang.com/schema/ddframe/reg
http://ww.dangdang.com/schema/ddfrane/reg/ reg . xsd 
http://ww.dangdang.com/schema/ddframe/job
http://ww.dangdang.com/schema/ddfranme/job/job.xsd
-
 reg : zookeeper id -" regcenter ” erver - lists =“192.168.104.102:2181” namespace - dd -3ob
< iob : simple id -" demosimplespringJob ” ctass -" example . MyElasticJob " registry - center - ref =" regCenter " cron ="0/10+***?” harding - total - count ="3"
 sharding - item - parameters =" O = A ,1- B ,2= C “/>

从配置中可以知道zookeeper注册中心地址,名称空间, 以及作业的分片数目。在这里为了模拟多机器部署,先对工程进行maven打包, 然后在本机启动项目,同时把打的jar包丢到虚拟机里执行

圈 elastic - job - example - quick - demo -2.1.5- jar - with - depepdenciesdar Omxm
![](p3-juejin.byteimg.com/tos-cn-i-k3…

这样在2台不同的机器上启动了同一个作业服务,打开Elastic Job运维平台,注册中心配置内容为之前applicationContext.xml的配置内容,点击连接进入

aa04e16770b21b5c2bdcdf7eec42db1.png

此时可以看到具体的作业信息

8f434ccf3af83bba348a26fa2f9b712.png

还可以看到有几个服务器在执行这个作业

6ee688be4c4a5b1d3ad8e390ab22fa9.png

其中99.1是我的本地电脑, 102是我的虚拟机。 系列导航:

熟练使用 Elastic Job系列之概念介绍(一)

熟练使用 Elastic Job系列之注册中心与节点(二)

熟练使用 Elastic Job系列之入门Demo(三)

熟练使用 Elastic Job系列之运维平台搭建与使用(四)

那么服务器和作业分片是什么样的关系了, 回顾上下文可以了解到, 作业的分片数是3, 机器实例是2台,默认的分片策略是AverageAllocationJobShardingStrategy,所以通过运维平台查看作业详情如下, 和AverageAllocationJobShardingStrategy的策略描述是相符合的。

0e802d4253e794e7de0a4c8490eb56a.png

自定义分片策略

实现JobShardingStrateg接口并实现sharding方法即可,可以根据需求定制化自己的分片策略。与配置通常的作业属性相同,在spring命名空间或者JobConfiguration中配置jobShardingStrategyClass属性,属性值是作业分片策略类的全路径。

自定义分片策略
 public final class My JobshardingStrategy implements Jobshardingstrategy l 
 private static final Logger log = LoggerFactory . getLogger ( MyJobShardingstrategy . class );
作 y 分﹣
 aparam jobInstances 
所有参与分片的单元列表
 aparam jobName 
 fs 
 aparam shardingTotalcount 分片总数
@ return 
a0verride
 public MapJobInstance , List < Integer >> sharding ( ListcJobInstance > jobInstances , String jobName , int sh 
 if ( jobInstances . isEmpty ()){
 return Collections . emptyMap ();
 MapcJobInstance , List < Integer >> result = new LinkedHashMap ( shardingTotalcount , lo 
 OadFaCtOr 
 for ( JobInstance each : jobInstances ){
 if ("192.168.104.102". equals ( each . getIp ()))
 List < Integer > shardingItems = new ArrayList ( shardingTotalcount ); for ( int i =0; i < shardingTotalCount ; i ++) f 
log.info("给实例{放入分片", each . getIp (), i ); shardingItems . add ( i );
 result . put ( each , shardingItems );
 return result ;
private LiteJobConfigurationgetLiteJobConfiguration(finalClass<? extends SimpleJob> jobClass, final String cron, final int shardingTotalCount
, final String shardingItemParameters){
SimpleJobConfigurationsimpleJobConfiguration=newSimpleJobConfiguration(JobCoreConfiguration.newBuilder(jobClass.getName(), cron,
shardingTotalCount).shardingItemParameters(shardingItemParameters).build(),jobClass.getCanonicalName());
return LiteJobConfiguration.newBuilder(simpleJobConfiguration)配置自定义分片侧率
.jobShardingStrategyClass("com.dangdang.ddframe.job.example.config.MyJobShardingStrategy" overwrite(true).build();  

这里代码的含义是吧所有的分片都分配给192.168.104.102这台机器上。

同样也是想把项目打成jar包, 分别为本地项目IDEA直接启动,jar包在虚拟机啊里通过java -jar方式启动

dooinenenaLerfd0gane  9dogee  
Map<java.lang.String,java.lang.0bject>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(iavax.servlet.http.HttpServletRequest)
INFO 1 2020-08-04 16:58:25,220 --com.dangdang.ddframe.iob.example.iob.simple.SpringSimpleJob Worker-1- com.danadana.ddframe.iob.example.confil.MvJobShardinaStrateav1 给实例192.168.104.102放入分片6
INFO 1 2020-08-04 16:58:25,221--com.dalgdang.ddframe.iob.example.iob.simple.SpringSimpleJob Worker[com.dangdang.ddframe.job.example.config.MyJobShardingStrategy] 给实例192.168.104.102放入分片1
INFO1 2020-08-04 16:58:25,221--com.dagdang.ddframe.iob.example.iob.simple.SpringSimpleJob Worker[com.dangdang.ddframe.job.example.confid.MyJobShardingStrategy] 给实例192.168.104.102放入分片2
[INFO ] 2020-08-04 16:58:25,274 --main--  org.springframework.web.servlet.handler.SimpleUrlHandlerMapbin  
g] Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.Re
sourceHttpRequestHandler]

可以发现控制台打印输出了自定义分片策略代码中的日志,此时连接运维平台查看,这里配置有修改,稍后可以自行下载源码查看调试。

c7dde4d611ce3629105eed8024de075.png

a69e6f463a7431ba75a6c05c44cac1a.png

本文相关代码请参考

elastic-job-example-quick-demo

lastic-job-example-lite-springboot-shardingStrategy

目录
相关文章
|
8月前
|
Java 调度 Maven
Elastic-job分布式调度系统
Elastic-job分布式调度系统
|
8月前
|
SQL 分布式计算 Hadoop
Azkaban【基础 01】核心概念+特点+Web界面+架构+Job类型(一篇即可入门Azkaban工作流调度系统)
【2月更文挑战第6天】Azkaban【基础 01】核心概念+特点+Web界面+架构+Job类型(一篇即可入门Azkaban工作流调度系统)
600 0
|
3月前
|
Java 调度
利用 XXL-JOB 实现灵活控制的分片处理
本文讲述了一种利用 XXL-JOB 来进行分片任务处理的方法,另外加入对执行节点数的灵活控制。
58 2
|
7月前
|
存储 SQL 测试技术
Flink⼤状态作业调优实践指南:状态报错与启停慢篇
本文整理自俞航翔、陈婧敏、黄鹏程老师所撰写的大状态作业调优实践指南。由于内容丰富,本文分享终篇状态报错与启停慢篇.
50565 65
Flink⼤状态作业调优实践指南:状态报错与启停慢篇
|
8月前
|
Java 应用服务中间件 调度
xxl-job任务调度2.0.2升级到2.3.0版本,执行器改造过程中经验总结
xxl-job任务调度2.0.2升级到2.3.0版本,执行器改造过程中经验总结
658 0
|
资源调度 分布式计算 Hadoop
Yarn队列租户配置教程(实践记录)
Yarn队列租户配置教程(实践记录)
184 0
|
Java API 调度
Elastic-Job的快速入门,三分钟带你体验分布式定时任务
Elastic-Job的快速入门,三分钟带你体验分布式定时任务
Elastic-Job的快速入门,三分钟带你体验分布式定时任务
|
运维
Elastic Job进阶--作业是如何被立即触发的
Elastic Job进阶--作业是如何被立即触发的
317 0
|
存储 算法 安全
定时任务之elastic-job概述
定时任务之elastic-job概述
417 0
|
数据可视化 Java 关系型数据库
【非广告】分布式调度框架 elastic-job 实践详解(超详细)(一)
在前几篇文章中,我们详细的介绍了 Quartz 的架构原理以及应用实践,虽然 Quartz 也可以通过集群方式来保证服务高可用,但是它也有一个的弊端,那就是服务节点数量的增加,并不能提升任务的执行效率,即不能实现水平扩展!
【非广告】分布式调度框架 elastic-job 实践详解(超详细)(一)