基于CompletableFuture的异步调用器

1、背景

当在一个复杂业务中调用多个接口时会使接口的响应时间逐渐增加,进而使用CompletableFuture回掉方式进行多个接口的整合优化
正常编写如下图的接口总耗时>=F+G+H+I+J+K+L+M的时间总和
在这里插入图片描述
如果底层接口都没有依赖那么响应时间可以优化至最大底层接口的时间 max(F/G/H/I/J/K/L/M)
优化后示意图
在这里插入图片描述

2、优化

使用管道通信+异步回调,将无依赖的接口全部放入执行器中执行,如果D依赖E 那么E调用后通过回调形式通知D再进行D接口的调用
配置示例如下

[
  {
    "jobName": "ListExpertInfoJob",
    "jobClass": "com.bo.job.ListExpertInfoJob"
  },
  {
    "jobName": "ListExportEnterDatabaseInfoDTOJob",
    "jobClass": "com.bo.job.ListExportEnterDatabaseInfoDTOJob",
    "dependsOn": [
      "ListExpertInfoJob"
    ]
  }
 ]

完整配置

[
  {
    "jobName": "ListExpertInfoJob",
    "jobClass": "com.bo.job.ListExpertInfoJob"
  },
  {
    "jobName": "ListExportEnterDatabaseInfoDTOJob",
    "jobClass": "com.bo.job.ListExportEnterDatabaseInfoDTOJob",
    "dependsOn": [
      "ListExpertInfoJob"
    ]
  },
  {
    "jobName": "ListExpertMajorJob",
    "jobClass": "com.bo.job.ListExpertMajorJob",
    "dependsOn": [
      "ListExportEnterDatabaseInfoDTOJob"
    ]
  },
  {
    "jobName": "ListExpertCertJob",
    "jobClass": "com.bo.job.ListExpertCertJob",
    "dependsOn": [
      "ListExpertInfoJob"
    ]
  },
  {
    "jobName": "ListCollectManageByIdsJob",
    "jobClass": "com.bo.job.ListCollectManageByIdsJob",
    "dependsOn": [
      "ListExpertInfoJob"
    ]
  },
  {
    "jobName": "ListExportRegCategoryCertJob",
    "jobClass": "com.bo.job.ListExportRegCategoryCertJob",
    "dependsOn": [
      "ListExpertMajorJob"
    ]
  },
  {
    "jobName": "ListExportProTitleCertJob",
    "jobClass": "com.bo.job.ListExportProTitleCertJob",
    "dependsOn": [
      "ListExpertMajorJob"
    ]
  },
  {
    "jobName": "ListExportCompanyRelJob",
    "jobClass": "com.bo.job.ListExportCompanyRelJob",
    "dependsOn": [
      "ListExpertMajorJob"
    ]
  },
  {
    "jobName": "ListExportCompanyJob",
    "jobClass": "com.bo.job.ListExportCompanyJob",
    "dependsOn": [
      "ListExportCompanyRelJob"
    ]
  },
  {
    "jobName": "BuildExcelDataJob",
    "jobClass": "com.bo.job.BuildExcelDataJob",
    "dependsOn": [
      "ListExpertInfoJob",
      "ListExportEnterDatabaseInfoDTOJob",
      "ListExportProTitleCertJob",
      "ListExportRegCategoryCertJob",
      "ListExportCompanyRelJob",
      "ListExportCompanyJob",
      "ListExpertMajorJob",
      "ListExpertCertJob",
      "ListCollectManageByIdsJob"
    ]
  }
]

整体响应时间优化后如下
在这里插入图片描述

@RestController
@Slf4j
public class DemoController {

    @RequestMapping("demo")
    public List<BuildExcelDataJobData.ExportDataDTO> demo() {

        List<TaskContext> contexts = new ArrayList<>();

        String taskName = "listData";
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        for (int i = 0; i < 3; i++) {
            int minus = i * 10;
            DemoReq demoReq = new DemoReq();
            demoReq.setCollectManageIds(Arrays.asList(1L + minus, 2L + minus, 3L + minus));
            TaskContext taskContext = TaskContext.newInstance(demoReq);
            TaskExecutor.startTask(taskName, taskContext);
            contexts.add(taskContext);
        }

        List<BuildExcelDataJobData.ExportDataDTO> r = new ArrayList<>();
        for (int i = 0; i < contexts.size(); i++) {
            BuildExcelDataJobData result = (BuildExcelDataJobData) contexts.get(i).getResult();
            r.addAll(result.getData());
            log.info("i {} task {} cos {}", i, taskName, contexts.get(i).totalCos());
        }
        stopWatch.stop();
        log.info("total cos {}", stopWatch.getTotalTimeMillis());
        return r;
    }

}

示例代码在资源包中
github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值