上一篇文章中我们聊了一下线程池,基于线程池的多线程编程是我们在高并发场景下提升系统处理效率的有效手段,但却不是唯一的。今天我们来看一下另一种异步开发的常用手段-响应式编程模型
传统多线程模型的缺陷
多线程模型是目前应用最为广泛的并发编程手段,但凡遇到什么性能瓶颈,首先想到的就是弄个线程池把任务丢进去并发执行,但它其实存在一些明显的缺陷。我们先来看一个例子,在一个web服务中,某个接口需要完成如下的任务:
- 从数据库中查询一个数据
- 调用另一个微服务的接口拿到另一个数据
- 将两个数据组合起来并返回给用户
一个简化后的线程处理时序图可能是这样的:
从上图可以看出,不同用户的请求可以在线程池的线程并发的执行,但是单个用户的处理过程却仍然是串行执行的,而且由于数据库查询,调用微服务接口,写HTTP返回值都是典型的IO操作,导致线程大多数时间都处于阻塞状态。
如果是高并发场景,比如此时有1000个用户同时需要调用该接口,如果没有对线程池的数量加以限制的话,最高可能会创建1000个线程来处理用户请求,而这些昂贵的系统资源偏偏大部分时间都处于阻塞之中,这无疑是一个巨大的浪费。
响应式开发模型
看了上面的例子,小伙伴们很容易想到,如果线程在等待IO的过程中不需要保持活动状态,而能够去处理其它一些无需等待的任务&#x