接口耗时优化, 并发数和 响应时间 关系

137 阅读1分钟

接口耗时优化, 并发数和 响应时间 关系


ProcessThreadPool.getBTaskThreadPool(50).loadTasks(new UpdateConsumptionRecordLogThread(log);

//批量更新  --->  并发更新
//Integer result = consumptionDetailBusiness.updateConsumptionDetails(list));


int splitListSize = 100;
List<List<PersonConsumptionDetailBo>> lists = ListUtil.splitList(listPersons, splitListSize);
ExecutorService service = ProcessThreadPool.getExecutorService(lists.size() + 1);
List<FutureTask<Integer>> futureTaskList = new ArrayList<>();
for (List<PersonConsumptionDetailBo> list : lists) {

    FutureTask<Integer> futureTask = new FutureTask<>(
    () ->      consumptionDetailBusiness.updateConsumptionDetails(list)
    );
    
    futureTaskList.add(futureTask);
    service.submit(futureTask);
    result = list.size();

}


public static ExecutorService getExecutorService(int threadPoolSize) {
    if (threadPoolSize <= 0) {
        threadPoolSize = THREAD_POOL_SIZE;
    }
    ExecutorService service = Executors.newFixedThreadPool(threadPoolSize);
    return service;

}


int splitListSize = 100;

result = future.get():耗时:13893
result = future.get():耗时:14306
result = future.get():耗时:14306
result = future.get():耗时:14306
result = future.get():耗时:15316
result = future.get():耗时:15316
result = future.get():耗时:15421
result = future.get():耗时:15421
    

    

int splitListSize = 50;

result = future.get():耗时:10539
result = future.get():耗时:10619
result = future.get():耗时:10619
result = future.get():耗时:10619
result = future.get():耗时:10619
    

int splitListSize = 30;

result = future.get():耗时:6096
result = future.get():耗时:6096
result = future.get():耗时:6376
result = future.get():耗时:6376
result = future.get():耗时:6376
result = future.get():耗时:6376     
    
    
1.  从 表取「目标数据」时,开启多线程,进行分页筛选,将获取到的「目标数据」存放到 `result` 列表中。


//分页大小  默认 5000
int pageSize = this.getPageSize();
//页码数
int pageCnt = totalNum / this.getPageSize() + 1;

List<Map<String, Object>> result = Lists.newArrayList();
List<Future<List<Map<String, Object>>>> futureList = new ArrayList<>(pageCnt);

//开启多线程调用
for (int i = 1; i <= pageCnt; i++) {
   //将业务配置的筛选规则和排序规则 构建为 SelectionQueryCondition 对象
   SelectionQueryCondition selectionQueryCondition = buildSelectionQueryCondition(selectionQueryRuleData);
   selectionQueryCondition.setPageSize(pageSize);
   selectionQueryCondition.setPage(i);
   futureList.add(selectionQueryEventPool.submit(
   new  QuerySelectionDataThread(selectionQueryCondition))
   );
}


for (Future<List<Map<String, Object>>> future : futureList) {
   //RPC 调用
   List<Map<String, Object>> queryRes = future.get(20, TimeUnit.SECONDS);
   if (CollectionUtils.isNotEmpty(queryRes)) {
       // 将目标数据存放在 result 中
       result.addAll(queryRes);
   }
}

2.  对目标数据 `result` 进行排序,得到最终的「结果数据」。