Jmeter压测以及高并发异步优化
同步发送+restTemplate未池化
600到700QPS(跟服务器性能有关)
使用@Async注解,异步请求
什么是异步
- 异步调用时相对于同步而言,同步调用时指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行;通俗点理解,比如早上收作业,同步就是,如果遇到小朋友作业没写完,就等他写完再进行下一步,异步就会跳过这个小朋友,先收后面小朋友的作业
- 多线程就是一种实现异步调用的方式
- MQ也是一种宏观上的异步
使用方式
- 启动类使用@EnableAsync注解开启功能,自动扫描
- 定义异步任务类并使用@Component标记组件被容器扫描,异步方法加上@Async
使用异步之后的QPS
提升不止一点点
Async失效情况
- 注解Async的方法不是publice方法
- 返回值只能是void或者future
- 不能使用static也会失效
- spring无法扫描到异步类
- 调用方和被调用方不能在同一个类
- 原因:
- Spring在扫描Bean的时候会扫描方法上是否包含@Async注解,动态地生成一个子类(即proxy代理类),实际上是代理类来调用这个有注解的类,代理类在调用时提供了异步功能
- 如果有注解的方法是被同一个类中的其他方法调用,这次调用并没有通过代理类,也就无法受到代理类提供的异步功能
- 一般要将异步执行的方法单独抽取成一个类
- 原因:
- 类中需要使用Autowired或者Resource等注解注入,不能手动new
- 在Async方法上标注Transactional是没用的,但在Async方法调用的方法上加是有效的