1. 单线程模型
所有的IO操作都由同一个NIO线程处理,此时NIO线程职责包括:接收新建连接请求、读写操作等。(在一些小容量应用场景下,可以使用单线程模型)
image.png
举一个例子:我开了一个饭店,什么事我都亲力亲为。招待客人、做菜、结账都由我一个人来做,此时的我就是Reactor单线程。当我的饭店生意特别好,客人很多时,就会忙不过来,对应到这里就是网络请求会很慢,甚至出现服务器的宕机。
2. 多线程模型
有一组 NIO 线程来处理连接读写操作,由一个单线程来接收客户端连接,连接后丢给线程池,由线程池来完成读写请求。
举一个例子:饭店生意很好,所以我招了一个人专门在门口接待客人,让她把客人带进来,带进来之后的事情她就不能管了,从另外的一组人中叫一个出来来负责这个客人。
image.png
在绝大多数场景下,Reactor 多线程模型可以满足性能需求。但是,在个别特殊场景中,一个 NIO 线程负责监听和处理所有的客户端连接可能会存在性能问题。例如并发百万客户端连接,或者服务端需要对客户端握手进行安全认证,但是认证本身非常损耗性能。
3. 主从线程模型(Netty官方推荐)
服务端用于接收客户端连接的不再是一个单独的 NIO 线程,而是一个独立的 NIO 线程池。一组线程池接收请求,一组线程池处理IO。主线程池主要负责客户端登录、握手、安全认证等等,一旦链路建立完毕,就会把请求丢给从线程池。从线程池负责编解码、读写等等。
image.png
对应到例子就是在门口的小姐姐忙不过来了,所以我多招了几个小姐姐来负责接待客人。
网友评论