自带的分片策略
框架默认提供了三种分片策略,所有的分片策略都是接口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
策略说明:
- 基于平均分配算法的分片策略,也是默认的分片策略。
- 如果分片不能整除,则不能整除的多余分片将依次追加到序号小的服务器。如:
- 如果有3台服务器,分成9片,则每台服务器分到的分片是:1=[0,1,2], 2=[3,4,5], 3=[6,7,8]
- 如果有3台服务器,分成8片,则每台服务器分到的分片是:1=[0,1,6], 2=[2,3,7], 3=[4,5]
- 如果有3台服务器,分成10片,则每台服务器分到的分片是:1=[0,1,2,9], 2=[3,4,5], 3=[6,7,8]
OdevitySortByNameJobShardingStrategy
全类路径:
io.elasticjob.lite.api.strategy.impl.OdevitySortByNameJobShardingStrategy
策略说明:
- 根据作业名的哈希值奇偶数决定IP升降序算法的分片策略。
- 作业名的哈希值为奇数则IP升序。
- 作业名的哈希值为偶数则IP降序。
- 用于不同的作业平均分配负载至不同的服务器。
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
的配置内容,点击连接进入
此时可以看到具体的作业信息
还可以看到有几个服务器在执行这个作业
其中99.1是我的本地电脑, 102是我的虚拟机。 系列导航:
熟练使用 Elastic Job系列之运维平台搭建与使用(四)
那么服务器和作业分片是什么样的关系了, 回顾上下文可以了解到, 作业的分片数是3, 机器实例是2台,默认的分片策略是AverageAllocationJobShardingStrategy
,所以通过运维平台查看作业详情如下, 和AverageAllocationJobShardingStrategy
的策略描述是相符合的。
自定义分片策略
实现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]
可以发现控制台打印输出了自定义分片策略代码中的日志,此时连接运维平台查看,这里配置有修改,稍后可以自行下载源码查看调试。
本文相关代码请参考