# Netty
- 解决了NIO的Epoll Bug(Selector空轮询,CPU100%的BUG)
- 设计优雅
- 适用于各种传输类型的统一API阻塞与非阻塞Socket;
- 灵活可扩展的事件模型,清晰的分离了关注点
- 线程模型支持单线程、一个或多个线程池
- 使用方便
- 无额外依赖
- 文档、指南、示例全
- 高性能、高吞吐、低延迟、低资源消耗、最小化内存复制
- 安全:SSL/TLS,StartTLS支持
- 社区活跃
# Reactor模式
IO利用结合线程池,又叫Dispatcher模式
- 一个或多个请求同时传递给“服务处理器(基于事件驱动)“
- 程序处理传入的多个请求,并将它们同步分派到相应的处理线程
- 采用IO复用监听事件,收到事件后,分发给某个线程(进程)
Client--------event------->eventDispatcher(ServiceHandler)--------dispatch----->EventHandler(处理线程)
核心组成:
- Reactor:单独线程中运行,负责监听与分发事件,把事件分发给适当的处理程序处理IO事件
- Handlers:处理程序执行IO事件要完成的实际任务
模式分类:
单Reactor
- 模型简单,没有多线程、进程通信、竟争的问题
- 性能问题,无法发挥多核CPU的性能,Handler在处理某连接任务时,无法处理其它连接事件
- 可靠性问题,线程意外终止或进入死循环,会导致事件通信模块不可用
单Reactor 多线程
- handler只负责响应事件,不再做业务处理,由Worker线程池来做业务处理
- 利用多核优势
- 数据共享与访问复杂,reactor主线程处理事件的监听与响应,是单线程,高并发场景产下有性能瓶颈
主从Reactor 多线程
- 主线程MainReactor通过Select监听连接事件,通过Acceptor处理连接事件
- 连接事件处理后,MainReacotr将连接分配给SubReactor(可有多个),SubRactor将连接加入连接队列监听,并创建Handler进行事件处理
- handler通过处理IO,分发给Worker线程(可有多个)处理业务
优点:
- 父子线程交互简单,职责明确
- Reactor主线程只需要把连接传递给子线程,子线程无需要返回数据
缺点:
- 编程复杂度高
Netty的线程模型:
基于主从Reactor多线程模型做了优化,BossGroup线程维护Selector,只关注Accept;收到Accept事件,获取到对应的SocketChannel封装成NIOSocketChannel并注册到Worker线程(事件循环),并进行维护;WorkerGroup线程监听到Selector中通道发生自己感兴趣的事件后,由handler处理
- 两组线程池( NioEventLoopGroupo类型)
- BossGroup:负责接收客户端连接
- WorkerGroup:负责网络读写
- NioEventLoopGroup
- 可以有多个线程,即可含有多个NioEventLoop,相当于事件循环组,这个组中含有多个事件循环,每个事件循环是NioEventLoop
- NioEventGroup表示一个不断循环的执行处理任务的线程,每个上面都有一个selector,用于监听绑定在其上的socket网络通信
- BossGroup中的NioEventLoop循环执行
- 轮询accept事件
- 处理accept事件,与client建立连接,生成NioSocketChannel,并将其注册WorkerGroup上的某个NioEventLoop上的selector
- 处理任务队列的任务,即runAllTasks
- WokerGroup中的NioEventLoop执行
- 轮询read/write事件
- 处理IO事件,即read/wirte事件,在对应的NioSocketChannel处理
- 处理任务队列的任务,即runAllTasks
``
← NIO Spring AOP →