自带的分片策略
框架默认提供了三种分片策略,所有的分片策略都是接口JobShardingStrategy的实现
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=来设置作业分片数, 如图所示,
从配置中可以知道zookeeper注册中心地址,名称空间, 以及作业的分片数目。在这里为了模拟多机器部署,先对工程进行maven打包, 然后在本机启动项目,同时把打的jar包丢到虚拟机里执行

那么服务器和作业分片是什么样的关系了, 回顾上下文可以了解到, 作业的分片数是3, 机器实例是2台,默认的分片策略是AverageAllocationJobShardingStrategy,所以通过运维平台查看作业详情如下, 和AverageAllocationJobShardingStrategy的策略描述是相符合的。
自定义分片策略
实现JobShardingStrateg接口并实现sharding方法即可,可以根据需求定制化自己的分片策略。与配置通常的作业属性相同,在spring命名空间或者JobConfiguration中配置jobShardingStrategyClass属性,属性值是作业分片策略类的全路径。
这里代码的含义是吧所有的分片都分配给192.168.104.102这台机器上。
同样也是想把项目打成jar包, 分别为本地项目IDEA直接启动,jar包在虚拟机啊里通过java -jar方式启动
可以发现控制台打印输出了自定义分片策略代码中的日志,此时连接运维平台查看,这里配置有修改,稍后可以自行下载源码查看调试。
本文相关代码请参考