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