背景
处理性能问题发现一个API耗时过长,代码中只有两个处理数据入表以及使用RestTemplate远程调用发送通知。通过日志看到整个insert仅仅用了10毫秒;最终发现RestTemplate远程发送通知耗时远远超过数据库insert耗时。
处理
- 因为发送通知为调用其他微服务处理且不需要得到返回值,觉得对发送通知service改造为异步调用
- SpringBoot异步注解
原打算使用Springboot自有@Async和EnableAsync注解来处理,但是原代码中存在循环依赖问题,造成服务无法启动,若使用此方式需要整改的代码过多。 - 使用线程池
线程池也可作为实现异步的一种方式,但是不知道和@Async相比是不是有劣势
3.1. 创建线程池代码
@Configuration
public class ThreadPoolConfig {
@Bean
public ExecutorService crawlExecutorPool(){
return Executors.newSingleThreadExecutor();
}
}
3.2 . 代码调用
@Resource(name = "crawlExecutorPool")
private ExecutorService threadExector;
threadExector.execute(new Runnable() {
@Override
public void run() {
// 通知
infoService.registerPushNotification(assignedPatId, payload, null, true);
}
});
- 使用CompletableFuture
CompletableFuture使用并不是非常熟练,还需要继续学习一下!
CompletableFuture.runAsync(() -> {
// 通知
infoService.registerPushNotification(assignedPatId, payload, null, true);
});