金融高并发、低延迟交易系统中接口高并发多线程性能优化解决方案之Async异步处理

一句话总结

👋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的异步配置

开启配置

  1. @EnableAsync

  2. @Async

测试结果

从原来的2s变成现在的3ms

在这里插入图片描述

在这里插入图片描述

以上的方案,存在以下问题❓

1. 线程不复用

@Async中,对应的源码, 拦截器org.springframework.aop.interceptor.AsyncExecutionInterceptor
在这里插入图片描述在这里插入图片描述
解决方案: 使用ThreadPoolTaskExecutor

2.@Transactional事务失效

3. 百万级的高并发下,使用spring默认线程会导致线程阻塞,影响主交易流程

解决方案2:异步+专用线程池

需要考虑的点:

  1. 资源隔离和稳定性:避免主线程池池和trade同步专用线程池资源竞争,避免专用模块的突发流量阻塞其他模块的任务
  2. 专用线程池的隔离性:配置单独的tradeThreadPoolTaskExecutor线程池,即使这个模块任务堆积,也不影响其他模块
  3. 性能调用

代码优化

  1. 默认线程池调整
  2. 创建trade同步专用线程池 @Bean(“tradeThreadPoolTaskExecutor”)
  3. @Async调整
    在这里插入图片描述

测试结果

在这里插入图片描述

效果

交易订单数据多系统同步,延迟优化从原来的**>2s到10ms左右**

总结

异步别乱用,看场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值