Netty学习笔记(四)—— EventLoop 和 EventLoopGroup

之前我们谈过 Channel 和 Unsafe 是用于操作 bind、connect、read、write等底层的网络传输,其大大降低了使用 Socket 类的复杂性。而 EventLoop 则是用于多线程、并发地处理连接生命周期中所发生的事件。因此选择合适的线程模型能有效地提高系统性能。
本文目录

1 Netty的线程模型

Netty 采用的 Reactor 线程模型

1.1 Reactor单线程模型

Reactor 单线程模型,即所有的 I/O 操作都在同一个 NIO 线程上完成,NIO 线程通过 Acceptor 类接收客户端的 TCP 连接请求信息,当链路建立成功以后,通过Dispatch 将对应的 ByteBuffer 派发给指定的 Handler。用户线程消息编码完成后通过 NIO 线程将消息发送给客户端。其模型图如下
缺点:
1. 一个 NIO 线程若处理成千上百的链路,性能上无法支撑;
2. NIO 线程负载过重后处理速度将变慢,导致大量客户端超时,超时后的重发将加重负载,造成系统性能瓶颈;
3. 单线程存在单点故障的问题,一旦线程死掉或死循环,将无法接受处理外部消息;

1.2 Reactor多线程模型

Reactor 多线程模型,即用一组 NIO 线程处理 I/O 操作。一个单独的 NIO 线程用来接受客户端 TCP 连接请求;一个 NIO 线程池来处理消息的读取、解码和编码、发送;其模型图如下
缺点:
1. 一个线程处理大量连接(百万并发)存在性能问题;
2. 服务端对客户端的握手进行安全认证存在性能损耗;

1.3 主从Reactor多线程模型

针对上述模型的缺点设计主从Reactor多线程模型,即接收客户端连接的 Acceptor是一个 NIO 线程池,Acceptor仅仅完成登录、握手和安全认证等操作,Acceptor处理完后,将事件注册到 IO 线程池的某个线程上,其模型图如下

1.4 Netty中Reactor模型实现

Netty 同时支持 Reactor 的单线程、多线程和主从多线程模型,在不同的应用中通过启动参数的配置来启动不同的线程模型。
以之前的Demo为例,通过简单的代码修改即可实现不同的线程模型
1、Netty单线程模型
将start方法作如下修改:

EventLoopGroup bossGroup = new NioEventLoopGroup(1);
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap = bootstrap.group(bossGroup)
              .channel(NioServerSocketChannel.class)
              .//....

2、Netty多线程模型
如Demo所示即为多线程模型

EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workGroup = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap = bootstrap.group(bossGroup, workGroup)
              .channel(NioServerSocketChannel.class)
              .//....

3、Netty主从Reactor线程模型
将start方法作如下修改:

EventLoopGroup bossGroup = new NioEventLoopGroup(4);
EventLoopGroup workGroup = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap = bootstrap.group(bossGroup, workGroup)
              .channel(NioServerSocketChannel.class)
              .//....

2 NioEventLoop 源码

To be continue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值