场景引入:大家都使用过淘宝购物,对于购物下单这个过程是怎么样的呢?处理请求的方式有两种,同步和异步。下单这个请求,肯定是使用异步线程来处理了,负责会占用服务器大量时间,降低服务器的吞吐量,也浪费了客户大量时间。下面,本文将以下单请求为例使用异步线程处理下单请求。
一、异步请求
下面是同步处理与异步处理的流程图,在同步处理中,当客户端发送来一个请求的时候,需要等服务器处理完该请求,然后在返回,这样服务器端只能做一件事,不能腾出时间来处理其他请求,因此,需要用异步线程来处理一些请求。异步处理中,我们会开多个线程,当发来http请求的时候,主线程会调用副线程来处理发来的请求,它会立即返回,这样服务器就可以处理其他的请求,将请求只交给一个线程来处理,客户端也感受不到处理业务带来的延迟。
我们如何来处理异步请求呢?这里着重介绍两种方式(基于springboot项目):
使用Runnable来单开线程处理异步请求
使用DeferedResul来处理异步请求
下面我们以文章开头介绍的下单实例来讲述上述两种方式的应用。
二、异步处理下单请求
1.使用Runnable处理
使用runnable处理非常简单,我们直接上代码:
上面是Controller层的代码,使用Callable重新开启了一个副线程来处理请求业务。
2.使用DeferedResult
对于下单的请求,我们可以给出请求的流程图,如上图所示,简单介绍一下上图流程,在一个大型的企业项目中,会有多个服务器来处理不同的业务,上述图中会有两个服务器,当客户端发来HTTP请求下单时,应用1就会开启线程1来接收该消息,并且将消息发送给消息队列,这个消息队列来存放所有的请求信息,由应用2来监听监听消息队列,从消息队列中取出请求,来处理相关业务,然后将处理的结果放到消息队列中,在应用1中会开启一个单独的线程2,这个线程来监听消息队列并且将消息队列中处理的结果返回给客户端。这里我们需要定义DeferResult来对线程1和线程2之间进行通信,将请求的订单返回给结果。
总结一下上面的流程的各个模块:
开启一个线程来处理HTTP请求。
需要一个消息队列来处理请求(这里不会去搭两个服务来处理请求,只是简单模拟一下)。
需要一个监听器(线程2)来监听消息队列,拿到真正的处理结果返回给客户。
除此之外,还需要一个DeferResult对线程1和线程2之间进行通信。
因此,我们看到上面会开启三个线程来处理客户请求。下面来看看各个模块的代码:
Controller层(线程1):
消息队列:
监听器(线程2):
最后,线程1和线程2之间需要通信,线程1要向线程2传递请求的订单,这里将订单封装一个类:
启动项目会看到控制台打印的日志信息:
浏览器的返回结果:
至此,本文已经介绍完使用异步的方式来处理客户端的请求,如有问题可以留言讨论。
欢迎关注公众号:
领取专属 10元无门槛券
私享最新 技术干货