请求异步编排优化
1、优化前
@Override
public AccountProductUseInfo getProductByAccount(String uid) throws ExecutionException, InterruptedException {
//请求数据
int classCount = classApiService.getTotalCount(uid);
int activityGameCount = activityGameApiService.getActivityGameCount(uid);
int coursewareCount = coursewareApi.getCoursewareCountByUid(uid);
DriveUsedBaseInfoDto spaceDetail = driveApi.getPersonalSpaceDetail(uid);
Double driveSpaceUsed = spaceDetail.getUsed().doubleValue() / 1024 / 1024;
String driveSpaceUsedFormat = String.format("%.2fMB", driveSpaceUsed);
List<String> appCodes = userMapper.getAppCodesByUid(uid);
//构建结果集
AccountProductUseInfo productUseInfo = new AccountProductUseInfo();
productUseInfo.setAppCodes(appCodes);
productUseInfo.setClassCount(classCount);
productUseInfo.setActivityGameCount(activityGameCount);
productUseInfo.setCoursewareCount(coursewareCount);
productUseInfo.setDriveSpaceUsed(driveSpaceUsedFormat);
return productUseInfo;
}
结果:维持在2s~3s

2、优化后
@Override
public AccountProductUseInfo getProductByAccount(String uid) {
//异步请求数据
CompletableFuture<Integer> classFuture = CompletableFuture.supplyAsync(() -> classApiService.getTotalCount(uid), syncRequestThreadPool);
CompletableFuture<Integer> activityGameFuture = CompletableFuture.supplyAsync(() -> activityGameApiService.getActivityGameCount(uid), syncRequestThreadPool);
CompletableFuture<Integer> coursewareFuture = CompletableFuture.supplyAsync(() -> coursewareApi.getCoursewareCountByUid(uid), syncRequestThreadPool);
CompletableFuture<DriveUsedBaseInfoDto> spaceDetailFuture = CompletableFuture.supplyAsync(() -> driveApi.getPersonalSpaceDetail(uid), syncRequestThreadPool);
CompletableFuture<List<String>> appCodesFuture = CompletableFuture.supplyAsync(() -> userMapper.getAppCodesByUid(uid), syncRequestThreadPool);
//等待所有请求完成
CompletableFuture<Void> allFuture = CompletableFuture.allOf(classFuture, activityGameFuture, coursewareFuture, appCodesFuture);
Integer classCount;
Integer activityGameCount;
Integer coursewareCount;
List<String> appCodes;
DriveUsedBaseInfoDto spaceDetail;
try {
allFuture.get(5, TimeUnit.SECONDS);
classCount = classFuture.join();
activityGameCount = activityGameFuture.join();
coursewareCount = coursewareFuture.join();
appCodes = appCodesFuture.join();
spaceDetail = spaceDetailFuture.join();
} catch (Exception e) {
log.error("Async Request Error:", e);
throw BusinessExceptionUtils.getBusinessException(ApplicationEnum.ASYNC_REQUEST_ERROR);
}
//构建结果集
AccountProductUseInfo productUseInfo = new AccountProductUseInfo();
Double driveSpaceUsed = spaceDetail.getUsed().doubleValue() / 1024 / 1024;
String driveSpaceUsedFormat = String.format("%.2fMB", driveSpaceUsed);
productUseInfo.setAppCodes(appCodes);
productUseInfo.setClassCount(classCount);
productUseInfo.setActivityGameCount(activityGameCount);
productUseInfo.setCoursewareCount(coursewareCount);
productUseInfo.setDriveSpaceUsed(driveSpaceUsedFormat);
return productUseInfo;
}
结果:维持在100ms到300ms
