分布式系统

xxl-job 分片策略

2019-06-19  本文已影响0人  蜗牛先森1230

策略一

结合分片总数和当前分片,分页加载处理想要表数据,如下所示:

//分片参数
ShardingVO shardingVO = ShardingUtil.getShardingVo();
int i=0;
int pageNo=1;

//执行器数量
int total = shardingVO.getTotal();
//当前分片(下标从0开始)
int index = shardingVO.getIndex();

WearUserQuery wearUserQuery;
do{
    wearUserQuery = new WearUserQuery();
    //页码以分片+分片总数
    wearUserQuery.setPageNo(index+pageNo);
    wearUserQuery.setPageSize(20);
    wearUserQuery.createCriteria().andFirstCommunicationTimeIsNotNull();
    List<WearUser> wearUsers = wearUserService.selectWearUserByQuery(wearUserQuery);
    i = wearUsers.size();
    for (WearUser wearUser : wearUsers) {
        //do something
    }
    //页码以分片+分片总数
    pageNo+=pageNo+total;
}while(i>=20);

以上代码中的缺点:

  1. 增加数据库访问量,执行效率慢
  2. 若执行过程中某个分片宕机了,就会重复加载处理数据

策略二

每个分片一次性读取要处理的数据,根据当前分片取模处理属于各自的数据

//分片参数
ShardingVO shardingVO = ShardingUtil.getShardingVo();
WearUserQuery wearUserQuery = new WearUserQuery();
wearUserQuery.createCriteria().andFirstCommunicationTimeIsNotNull();
List<WearUser> wearUsers = wearUserService.selectWearUserByQuery(wearUserQuery);
int i = wearUsers.size();
for (int j = 0; j < i; j++) {
    //对数据下标以当前分片取模选取处理
    if (j % shardingVO.getTotal() == shardingVO.getIndex()) {
        //do something
    }
}

以上代码如果执行节点1挂了,那么执行节点1的分片,将自动转移到执行节点2或者执行节点3执行,达到分片的高并发,高可靠。

上一篇 下一篇

猜你喜欢

热点阅读