20190825_Netty Reactor模式

Reactor模式翻译为反应器模式。
Netty整体架构是Reactor模式的完整体现。参考Doug Lea这篇著名的论文

模式角色

在这里插入图片描述

  1. Handle(句柄或描述符):本质上表现一个资源,是有操作系统提供的;该资源表示一个个的事件,比如文件描述符,或是针对网络编程里的socket描述符。既可以来自外部,也可以来自内部;外部事件比如客户端的连接请求,客户端发来数据等;内部事件比如操作系统产生的定时器事件等。Handle本身是事件产生的发源地。

  2. Synchronous Event Demultiplexer(同步事件分离器):它本来是一个系统调用,用于等待事件的发生(事件可能是一个,也可能是多个)。调用方在调用它的时候会被阻塞,一直阻塞到同步事件分离器上有事件产生为止。对Linux来说,同步事件分离器指的就是I/O多路复用的机制,比如select/poll/epoll等。在java NIO中,对应的组件就是Selector;而对应的阻塞方法就是select方法。

  3. Event Handler(事件处理器):本事有多个回调方法组成,这些回调方法构成了与应用相关的对于某个事件的反馈机制。Netty 相对于NIO, 做了升级,为开发者提供了大量的回调方法。

  4. Concrete Event Handler(具体事件处理器): 它是事件处理器的实现。它实现了事件处理器的各个回调方法,从而实现了特定的业务逻辑。它本质上就是我们所编写的处理器

  5. Initiation Dispatcher: 实际就是Reactor角色。它本身定义了一些规范,这些规范用于控制事件的调度方式,同时又提供了应用进行事件处理器的注册、删除等设施。一旦有事件发生,initiation Dispatcher先分离出每个事件,然后调用事件处理器,最后调用响应的回调方法来处理事件。

在这里插入图片描述

单线程模式

在这里插入图片描述
缺点:
1、 当其中某个 handler 阻塞时, 会导致其他所有的 client 的 handler 都得不到执行, 并且更严重的是, handler 的阻塞也会导致整个服务不能接收新的 client 请求(因为 acceptor 也被阻塞了)。 因为有这么多的缺陷, 因此单线程Reactor 模型用的比较少。这种单线程模型不能充分利用多核资源,所以实际使用的不多。

2、因此,单线程模型仅仅适用于handler 中业务处理组件能快速完成的场景。

多线程模式

在这里插入图片描述
一个线程/进程接收连接、一组线程/进程处理IO读写事件。也就是将accept的线程与处理读、写等IO事件的线程分离,并且使用m多个线程、使用非阻塞IO或者事件IO来处理n个套接字的IO事件,这里的n一般远大于m,m一般取CPU逻辑核心数的1-3倍,而套接字数n则取决于请求数和进程可以打开的最大描述符个数。
Reactor多线程模型可以满足绝大多数的场景,除了一些个别的特殊场景:比如一个NIO线程负责处理客户所有的连接请求,但是如果连接请求中包含认证的需求(安全认证),在百万级别的场景下,就存在性能问题了,因为认证本身就要消耗CPU,为了解决这种情景下的性能问题,产生了第三种线程模型:Reactor主从线程模型。

主从模型

在这里插入图片描述
主从Reactor线程模型的特点是:服务端用于接收客户端连接的不再是一个单独的NIO线程,而是一个独立的NIO的线程池。Acceptor接收到客户端TCP连接请求并处理完成后(可能包含接入认证),再将新创建的SocketChannel注册到IO线程池(sub reactor)的某个IO处理线程上并处理编解码和读写工作。Acceptor线程池仅负责客户端的连接与认证,一旦链路连接成功,就将链路注册到后端的sub Reactor的IO线程池中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值