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

1,987 阅读4分钟

自带的分片策略

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

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=来设置作业分片数, 如图所示, 从配置中可以知道zookeeper注册中心地址,名称空间, 以及作业的分片数目。在这里为了模拟多机器部署,先对工程进行maven打包, 然后在本机启动项目,同时把打的jar包丢到虚拟机里执行 ![](p3-juejin.byteimg.com/tos-cn-i-k3…

这样在2台不同的机器上启动了同一个作业服务,打开Elastic Job运维平台,注册中心配置内容为之前applicationContext.xml的配置内容,点击连接进入 此时可以看到具体的作业信息 还可以看到有几个服务器在执行这个作业 其中99.1是我的本地电脑, 102是我的虚拟机。 系列导航:

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

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

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

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

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

自定义分片策略

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

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

同样也是想把项目打成jar包, 分别为本地项目IDEA直接启动,jar包在虚拟机啊里通过java -jar方式启动 可以发现控制台打印输出了自定义分片策略代码中的日志,此时连接运维平台查看,这里配置有修改,稍后可以自行下载源码查看调试。

本文相关代码请参考

elastic-job-example-quick-demo

lastic-job-example-lite-springboot-shardingStrategy