请求异步编排优化

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

image-20221108161132221

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

image-20221109092753913