一句话总结
👋Async异步+单独线程池: 实现交易订单数据多系统同步,延迟优化
背景和痛点
投行交易系统成交数据需同步至风控、清算、报表等系统,日均百万数据量同步写操作,导致交易确认延迟超过2s,甚至更长。
很显然,同步等待,在高并发下,会拖垮系统。
技术解决思路
该场景下,满足以下两个条件(很重要呀❕):
- 非强实时
- 单个接口耗时长
考虑到以上的特质,该场景比较适合做异步处理。
同步异步区分
样例 | 描述 | |
---|---|---|
同步 | A->B->C->D 串行 | 整个处理过程ABCD顺序执行完毕,返回结果,耗时 ∑(A,B,C,D) |
异步 | A B C D 并行 | 发送调用的请求,调用者不需要等待调用方法完全执行完毕,而是继续下面的流程。 |
异步,用Complefuture.allof()拿返回 | A B C D 并行 | 发送调用的请求, 需要返回的结果,耗时Max(A,B,C,D) |
解决方案1:Spring的异步配置
开启配置
-
@EnableAsync
-
@Async
测试结果
从原来的2s变成现在的3ms
以上的方案,存在以下问题❓
1. 线程不复用
@Async中,对应的源码, 拦截器org.springframework.aop.interceptor.AsyncExecutionInterceptor
解决方案: 使用ThreadPoolTaskExecutor
2.@Transactional事务失效
3. 百万级的高并发下,使用spring默认线程会导致线程阻塞,影响主交易流程
解决方案2:异步+专用线程池
需要考虑的点:
- 资源隔离和稳定性:避免主线程池池和trade同步专用线程池资源竞争,避免专用模块的突发流量阻塞其他模块的任务
- 专用线程池的隔离性:配置单独的tradeThreadPoolTaskExecutor线程池,即使这个模块任务堆积,也不影响其他模块
- 性能调用
代码优化
- 默认线程池调整
- 创建trade同步专用线程池 @Bean(“tradeThreadPoolTaskExecutor”)
- @Async调整
测试结果
效果
交易订单数据多系统同步,延迟优化从原来的**>2s到10ms左右**
总结
异步别乱用,看场景。