同步与异步
Web同步调用
浏览器/客户端发起一个请求,Web服务器开启一个线程来处理请求,当请求处理完成以后,Web服务器返回处理结果,这就是同步调用。
在普通的场景下,如果服务器负载不大,并且后端服务也给力,同步调用并没有什么问题。
但在高并发场景下,请求服务端的线程总数是有限的,如果某个线程一直处于阻塞状态,就会影响系统的吞吐量。
Web异步调用
所谓异步请求,就是在当前线程调用以后直接返回,继续处理其他任务,当前调用处理成功以后再通过一个回调线程来处理返回结果。
举个做家务的例子类比一下:之前你烧火做饭,就只能守在旁边添柴加火,等饭做好了才能去摆放餐具;现在你买了一个电饭锅,当你向电饭锅添加了做饭必备的材料并下达了做饭的指令以后,电饭锅就自己开始工作了,你就可以抽身去摆放餐具了,等饭做好,电饭锅会主动蜂鸣通知你来取饭,这样做饭的效率就提高了很多,你的并行处理能力直线上升。
Spring MVC 3.2 以后的版本开始引入了基于 Servlet 3 的异步请求处理,可以实现如下的异步调用。
Web请求同步与异步调用对比
下面通过一个简单的同步和异步对比的例子,来快速演示WebAsyncTask的用法以及同步与异步调用的差异。
两个任务
首先定义一个Controller,并添加了两个方法来代表一次Web请求要进行的两个任务,这两个任务分别要执行3秒。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestControlle