背景
在系统的后台管理页面中,有一些数据的统计需求,往往是前端发一个请求,后端需要调用多个服务来进行数据的查询,然后组装给前端;如果数据量特别大,假设每个数据的查询需要1秒,有几个数据查询就需要多少秒,执行时间随着统计量上升而上升。
经分析,各个数据的查询是独立的,可以考虑改为并行统计,最后再合并,耗时只会是最耗时的那个服务,再加上并行计算额外的小部分耗时。
串行处理
之前的串行处理,就是在一个方法中,挨个调用其他方法,其他方法可能在同一个服务上,也可能在不同的微服务上,耗时等于各个方法调用之和。
public static Map dataStatistics() {
Map<String, Object> data = new HashMap<>();
data.put("userNum", countUserNum());
data.put("companyNum", countCompanyNum());
data.put("workNum", countWorkNum());
data.put("taskNum", countTaskNum());
data.put("courseNum", countCourseNum());
data.put("missionNum", countMissonNum());
data.put("loginNum", countLoginNum());
return data;
}
并行处理
使用CompletableFuture的supplyAsync异步调用方法,相当于每个方法单独起一个线程去执行
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> countUserNum(), executorService);
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> countCompanyNum(), executorService);
CompletableFuture<Integer> future3 = CompletableFuture.supplyAsync(() -> countWorkNum(), executorService);
CompletableFuture<Integer> future4 = CompletableFuture.supplyAsync(() -> countTaskNum(), executorService);
CompletableFuture<Integer> future5