手记

响应式编程

从SpringBoot2开始,web开发分为了两个流派。一个使用Servlet技术栈开发,称为传统派。一个使用Reactive技术栈,也就是响应式技术栈。

Servlet开发web应用的时候,使用Servlet API提供的规范搭配上Servlet容器(比如Tomcat),在配合上Spring的技术栈(如Spring Security、Spring MVC、Spring Data)去构建web应用。这种web应用称之为同步阻塞式IO架构。这种架构遵循了一个请求一个线程的模型。

举例:

当一个请求进来,作为服务器tomcat就应该分配一个线程来处理这个请求,如果有大量的请求进来,tomcat就会分配大量的线程,大量的线程一定会最终交给cpu来运行的。这样就会导致一些问题,比如某个cpu运行了太多线程,导致这个核心负载拉满,因为这个cpu要处理的事情太多了,对于每一个请求的用户来说,他们感觉到的效果就是这个线程被处理的时间太长了,因为cpu要分时间片挨个来处理每一个人。也可能会引申出第二个问题,假如还有很多线程被分配给了另外一个cpu,cpu正在处理这个线程期间,而这个线程需要等待一个数据,即阻塞。比如等待远程调用的结果返回,要等待网络操作,或者要等待io的磁盘读写,如果整个线程处于等待以后,那这个cpu有可能就处于空闲状态了,因为它也没有切换到其它线程继续运行任务,这就导致了计算资源的浪费。即如果使用原生的Servlet技术栈去来应对高并发和高吞吐的应用,就要做非常多的架构设计和处理才能去完成。


如果使用响应式技术栈,它底层是基于Reactive Stream技术规范,搭配上Netty这些支持异步的容器,包括Tomcat在Servlet3.1+以上也支持了这些异步请求。只要有了这些容器的支持,再来搭配上Spring的响应式技术栈(如Spring WebFlux、Spring Data Reactive、Spring SecurityReactive),这套方案搭配起来就可以实现挖掘多核CPU的能力去处理大量的并发这样的功能,比如:

当大量的请求进来以后,响应式底层会给予缓冲机制,再加上调度器,整个数据先放到缓冲区,然后由调度器负责给cpu核心进行调度,每一个核心跑的核心其实都很少,但当某一个线程处于等待期间(如等待某一些数据),未来这些数据一旦回来以后依然放到缓冲区,再去唤醒这些线程,即线程在等待期间,cpu会把这个线程的时间片暂停掉去运行其它线程,这样就能压榨cpu核心的资源,其实最终实现每一个cpu核心都能跑满,从来不闲值cpu,一旦发生等待就切换到另外一个任务。这就是响应式技术栈给我们一个功能和特效,即使用少量资源(依然还是这四个核心),不占用任何架构或人工编程模型的情况下就能处理大量请求。响应式技术栈天然支持高并发和高吞吐量的应用。

最终大家会总结出结论,如果我这个应用是普通应用,不要求高并发、高吞吐量等这些指标,依然可以使用Servlet这些技术栈,如果我要求高并发、高吞吐量这些指标,那就需要使用响应式技术栈开发起来是最简单、快速和安全的。
























0人推荐
随时随地看视频
慕课网APP