Reactive

在这里插入图片描述

同步与异步

传统的web模型 “命令式编程”:阻塞式模型,一个请求发过来,也许你会开启新的线程,但最后需要等待完成所有操作之后,才能返回response。

一个一个的操作组成了整个业务线,操作之间有先后顺序。所有具有先后顺序的操作,都在同一个线程内。
在这里插入图片描述

微服务:开启一个新的线程A去请求别的服务,A线程要等待业务结果返回之后,才能继续执行下面的业务逻辑。这是阻塞的。
在这里插入图片描述

Tomcat的NIO异步网络

网络连接的线程池,作用是和客户端建立连接:BIO,NIO;你也可以用多路复用器
但是到了Tomcat之后,业务线程要阻塞地等待业务处理结果,才能返回。
固定线程:连接线程与业务线程1:1的比例,这样的模式的缺陷是
每开启一个线程,需要1024KB的栈内存开销;(64位 jdk8下)
500个并发请求,在JVM至少需要占用500M内存,这还是没干活的情况下。如果栈内存满了,会stack over flow,整个JVM的栈就挂了。
当线程个数越多,系统响应的时间会越长。

如何具有弹性?用线程池。

轮询/长轮询
长连接是客户端和服务端同时设置才生效,长轮询是服务端编程处理手动挂起请求,与客户端无关。

长轮询:http可以保持90s,90s还没有返回的话,需要续租。这样就用http协议伪造了一个假的长连接。
这就是响应式的web。响应的是谁?响应的是客户端。
keep-alived:复用的TCP的连接通道,http复用了tcp连接。http是无状态的,并不是复用的http连接。
在这里插入图片描述
长轮询
在这里插入图片描述SSE:Server sent event,服务器发送事件。服务器给我推消息,我就没法给服务器推消息了。

传统的sevlet api,SSE:
在这里插入图片描述
在这里插入图片描述
抛一个线程,实际上并不是异步,因为还要等后面的线程返回数据,才能继续
在这里插入图片描述

观察者模式

你要有一个Observer对象,有一个Subject对象。Observer作为观察者,观察有没有新的事件发生。
要有一个观察者里面存了List,集合里面存放事件。

A是一个线程组,B也是一个线程组。A想要吃饭,告诉观察者。观察者让B做饭。B做完饭返回,A再去观察者那里拿。
每一个线程都在做自己该做的事,解耦。线程之间通过观察者通信。
在这里插入图片描述
两个线程组的连接数量是不对等的。
在这里插入图片描述
线程池是独立的,相互之间不影响,这样就不会因为某个业务阻塞。
在这里插入图片描述
懂了这个原理,然后我们就可以开始引入响应式的框架webflux了。

命令式编程与响应式

在这里插入图片描述
服务器推技术,Servlet3.0与3.1…

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐