Elasticjob的分片策略实现了三种。

AverageAllocationJobShardingStrategy是最基础的分片策略。

private Map<JobInstance, List<Integer>> shardingAliquot(final List<JobInstance> shardingUnits, final int shardingTotalCount) {Map<JobInstance, List<Integer>> result = new LinkedHashMap<>(shardingTotalCount, 1);int itemCountPerSharding = shardingTotalCount / shardingUnits.size();int count = 0;for (JobInstance each : shardingUnits) {List<Integer> shardingItems = new ArrayList<>(itemCountPerSharding + 1);for (int i = count * itemCountPerSharding; i < (count + 1) * itemCountPerSharding; i++) {shardingItems.add(i);}result.put(each, shardingItems);count++;}return result;
}private void addAliquant(final List<JobInstance> shardingUnits, final int shardingTotalCount, final Map<JobInstance, List<Integer>> shardingResults) {int aliquant = shardingTotalCount % shardingUnits.size();int count = 0;for (Map.Entry<JobInstance, List<Integer>> entry : shardingResults.entrySet()) {if (count < aliquant) {entry.getValue().add(shardingTotalCount / shardingUnits.size() * shardingUnits.size() + count);}count++;}
}

在最基础的分片策略下,以分片总量除以工作的节点总量为每个分片的平均数量。

存在可能除不尽的情况,所以排序较前的节点可能分担多一个分片的情况,由此会为每个节点对应的分片数组多申请一个空间。

之后按照整除的方式分别按照平均数量一次分给每个节点。

再分配完毕之后再把剩下的余数分片依次按照顺序给前面的几个分片。

OdevitySortByNameJobShardingStrategy在AverageAllocationJobShardingStrategy的基础上,根据任务名称的哈希值是否能被2整除来选择在执行AverageAllocationJobShardingStrategy分片前,是否将节点组逆序。

@Override
public Map<JobInstance, List<Integer>> sharding(final List<JobInstance> jobInstances, final String jobName, final int shardingTotalCount) {long jobNameHash = jobName.hashCode();if (0 == jobNameHash % 2) {Collections.reverse(jobInstances);}return averageAllocationJobShardingStrategy.sharding(jobInstances, jobName, shardingTotalCount);
}

同样,RotateServerByNameJobShardingStrategy在执行AverageAllocationJobShardingStrategy的分片之前,根据任务的哈希值与节点数量取模,将之前取模的结果依次加一的结果与节点数量重新取模对节点进行重新排序,再执行AverageAllocationJobShardingStrategy的分片。

@Override
public Map<JobInstance, List<Integer>> sharding(final List<JobInstance> jobInstances, final String jobName, final int shardingTotalCount) {return averageAllocationJobShardingStrategy.sharding(rotateServerList(jobInstances, jobName), jobName, shardingTotalCount);
}private List<JobInstance> rotateServerList(final List<JobInstance> shardingUnits, final String jobName) {int shardingUnitsSize = shardingUnits.size();int offset = Math.abs(jobName.hashCode()) % shardingUnitsSize;if (0 == offset) {return shardingUnits;}List<JobInstance> result = new ArrayList<>(shardingUnitsSize);for (int i = 0; i < shardingUnitsSize; i++) {int index = (i + offset) % shardingUnitsSize;result.add(shardingUnits.get(index));}return result;
}

elasticjob 分片策略相关推荐

  1. elasticJob分片跑批

    2019独角兽企业重金招聘Python工程师标准>>> 业务迅速发展带来了跑批数据量的急剧增加.单机处理跑批数据已不能满足需要,另考虑到企业处理数据的扩展能力,多机跑批势在必行.多机 ...

  2. elastic-job分片规则

    本图来自https://shardingsphere.apache.org/elasticjob/current/cn/dev-manual/sharding/ JobShardingStrategy ...

  3. sharding-jdbc分库分表的 4种分片策略

    如果我一部分表做了分库分表,另一部分未做分库分表的表怎么处理?怎么才能正常访问? 这是一个比较典型的问题,我们知道分库分表是针对某些数据量持续大幅增长的表,比如用户表.订单表等,而不是一刀切将全部表都 ...

  4. ShardingSphere(八) 分库分表的多种分片策略

    在之前文章<ShardingSphere(二) 水平分表配置搭建,实现分表写入读取>中,我们介绍了数据库的水平分表配置,在文章中只介绍了最简单的行表达式分表配置方式,但往往在实际中我们的业 ...

  5. shardingsphere 分片策略_ShardingSphere系列(二) 分片策略

    本文章适用于初学者demo:或概念理解中策略都在git中打好了tag想要学习那种策略仔细阅读redme即可: 具体代码与明细见:https://github.com/ssy-githup/shardi ...

  6. sharding-jdbc 分库分表的 4种分片策略

    往下开展前先做个答疑,前两天有个小伙伴私下问了个问题说: 如果我一部分表做了分库分表,另一部分未做分库分表的表怎么处理?怎么才能正常访问? 这是一个比较典型的问题,我们知道分库分表是针对某些数据量持续 ...

  7. 跟我学ShardingSphere之数据分片策略

    在前面一篇<跟我学ShardingSphere之SpringBoot + ShardingJDBC分库>我们介绍了如何利用ShardingJDBC进行分库,用到了inline行表达式分片策 ...

  8. Sharding JDBC(四) 分片策略一:标准分片策略StandardShardingStrategy

    目录 一.标准分片策略StandardShardingStrategy 二.StandardShardingStrategy配置实现 分库分表最核心的两点SQL 路由  . SQL 改写 applic ...

  9. sharding-jdbc 分库分表的 4种分片策略,还蛮简单的

    上文<快速入门分库分表中间件 Sharding-JDBC (必修课)>中介绍了 sharding-jdbc 的基础概念,还搭建了一个简单的数据分片案例,但实际开发场景中要远比这复杂的多,我 ...

最新文章

  1. oracle增量备份如何恢复,【Oracle】增量备份和全库备份怎么恢复数据库
  2. Nginx could not build the server
  3. javascript入门 - 1
  4. do {...} while (0) 在宏定义中的作用
  5. boost使用split分割字符串
  6. mybatis-generator 逆向生成工具(实体、dao、sql)
  7. mysql权限层级体系_MySQL权限体系介绍
  8. 《产品设计与开发(原书第5版)》——第1章 概论 1.1 成功的产品开发的特点...
  9. OCaml已经做好iOS开发准备
  10. 深圳的小伙伴有福利了!
  11. 测试PHP连接MYSQL成功与否的代码
  12. css实现三角箭头(兼容IE6)
  13. python 处理数据小工具_用Python这个小工具,一次性把论文作图与数据处理全部搞定!...
  14. 《云计算架构技术与实践》连载(2):1.2 云计算的发展趋势
  15. Vue中用Three.js创建一个3D会议室(三)拖动与旋转
  16. python、matplotlib画箱体图检验异常值
  17. 冬青看世界:“银河战舰“它叕来了,鲤鱼又将跃龙门?
  18. 单元格等于计算机日期,《excel表格怎样自动填写日期》 Excel单元格中自动获取当前日期与时间...
  19. Matlab 预防性维修,MATLAB进行预测性维护(官网例程)-基于相似性进行剩余有效寿命预测 – MATLAB中文论坛...
  20. 互联网是如何组建的,为什么需要IP地址和MAC地址?

热门文章

  1. springclould项目启动报错Could not resolve placeholder
  2. python爬虫中文乱码_Python爬虫处理抓取数据中文乱码问题
  3. ES6(三)——回调地狱和promise异步任务顺序执行(传参、错误处理)
  4. 浅谈C语言static关键字 静态变量 函数
  5. @Repository详解
  6. MySQL无法启动服务器(1067)
  7. 键盘鼠标共享效率工具-Synergy
  8. mysql 主备XtraBackup恢复
  9. Datrium公司以几近疯狂的方式提升速度表现
  10. Python基础之补充1