-阻塞IO
-非阻塞IO
-同步IO
-异步IO
-同步阻塞IO
-同步非阻塞IO
-异步阻塞IO
-异步非阻塞IO
只要理解了这些,你就能理解webflux的非阻塞了!
IO
一个IO操作其实有两个步骤:发起IO请求和实际的IO操作
阻塞IO和非阻塞IO的区别在于第一个步骤是否阻塞:发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO;如果不阻塞,那么就是非阻塞IO
同步IO和异步IO的区别就在于第二个步骤是否阻塞:如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO复用、信号驱动IO都是同步IO;如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO
举个不太恰当的例子:比如你家网络断了,你打电话去中国电信报修!
-你拨号—客户端连接服务器
-电话通了—连接建立
-你说:“偶家网断了,帮偶修下”—发送消息
-说完你就在那里等,那么就是阻塞IO
-如果正好你有事,你放下电话,然后处理其他事情了,过一会你来问下,修好了没—那就是非阻塞IO
-如果客服说:“马上帮你处理,你稍等”—同步IO
-如果客服说:“马上帮你处理,好了通知你”,然后挂了电话—异步IO
回到问题
SpringMVC5以前,一个请求过来后的流程大致是这样的:
服务端接收到请求,从线程池获取一个线程来处理
线程处理完成后,返回数据
线程被释放回线程池中
可以看到,当一个请求过来后,所有的处理结束后才会得到响应。
Webflux基于Reactor模型,一个主从Reactor模型如下图:
主Reactor用于响应连接请求,接收到请求后就分配一个channel,然后直接响应客户端
从Reactor用于处理IO操作请求,但是不处理具体逻辑
具体逻辑由工作线程去处理。工作线程处理完成后再去通知响应。