当前位置:首页 > Web开发 > 正文

这种局部无锁化的串行线程设计相比一个队列-多个工作线程模型性能更优

2024-03-31 Web开发

标签:

Netty 道理
Netty 是一个高性能、异步事件驱动的 NIO 框架,基于 JAVA NIO 供给的 API 实现。它供给了对TCP、UDP 和文件传输的撑持,作为一个异步 NIO 框架,Netty 的所有 IO 操纵都是异步非梗阻的,通过 Future-Listener 机制,用户可以便利的主动获取或者通过通知机制获得 IO 操纵功效。

Netty 高性能
在 IO 编程过程中,当需要同时措置惩罚惩罚多个客户端接入请求时,可以操作多线程或者 IO 多路复用技术进行措置惩罚惩罚。IO 多路复用技术通过把多个 IO 的梗阻复用到同一个 select 的梗阻上,从而使得系统在单线程的情况下可以同时措置惩罚惩罚多个客户端请求。与传统的多线程/多进程模型比,I/O 多路复用的最大优势是系统开销小,系统不需要创建新的特别进程或者线程,也不需要维护这些进程和线程的运行,降低了系统的维护事情量,节省了系统资源。

与 Socket 类和 ServerSocket 类相对应,NIO 也供给了 SocketChannel 和 ServerSocketChannel两种差此外套接字通道实现。

多路复用通讯方法

Netty 架构凭据 Reactor 模式设计和实现,它的处事端通信序列图如下:

技术图片


客户端通信序列图如下:

技术图片


Netty 的 IO 线程 NioEventLoop 由于聚合了多路复用器 Selector,可以同时并发措置惩罚惩罚成百上千个客户端 Channel,由于读写操纵都长短梗阻的,这就可以丰裕提升 IO 线程的运行效率,制止由于频繁 IO 梗阻导致的线程挂起。

异步通讯 NIO

由于 Netty 给与了异步通信模式,一个 IO 线程可以并发措置惩罚惩罚 N 个客户端连接和读写操纵,这从根柢上解决了传统同步梗阻 IO 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。

零拷贝(DIRECT BUFFERS 使用堆外直接内存)

Netty 的接收和发送 ByteBuffer 给与 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,JVM 会将堆内存 Buffer 拷贝一份到直接内存中,然后才写入 Socket 中。对比于堆外直接内存,动静在发送过程中多了一次缓冲区的内存拷贝。

Netty 供给了组合 Buffer 东西,可以聚合多个 ByteBuffer 东西,用户可以像操纵一个 Buffer 那样便利的对组合 Buffer 进行操纵,制止了传统通过内存拷贝的方法将几个小 Buffer 合并成一个大的Buffer。

Netty的文件传输给与了transferTo要领,它可以直接将文件缓冲区的数据发送到方针Channel,制止了传统通过循环 write 方法导致的内存拷贝问题内存池(基于内存池的缓冲区重用机制)跟着 JVM 虚拟机和 JIT 即时编译技术的成长,东西的分配和回收是个非常轻量级的事情。但是对付缓冲区 Buffer,情况却稍有差别,出格是对付堆外直接内存的分配和回收,是一件耗时的操纵。为了尽量重用缓冲区,Netty 供给了基于内存池的缓冲区重用机制。

高效的 Reactor 线程模型

常用的 Reactor 线程模型有三种,Reactor 单线程模型, Reactor 多线程模型, 主从 Reactor 多线程模型。

Reactor 单线程模型

Reactor 单线程模型,指的是所有的 IO 操纵都在同一个 NIO 线程上面完成,NIO 线程的职责如下:

1) 作为 NIO 处事端,接收客户真个 TCP 连接;

2) 作为 NIO 客户端,向处事端倡议 TCP 连接;

3) 读取通信对真个请求或者应答动静;

4) 向通信对端发送动静请求或者应答动静。

技术图片

由于 Reactor 模式使用的是异步非梗阻 IO,所有的 IO 操纵都不会导致梗阻,理论上一个线程可以独立措置惩罚惩罚所有 IO 相关的操纵。从架构层面看,一个 NIO 线程确实可以完成其承当的职责。例如,通过Acceptor 接收客户真个 TCP 连接请求动静,链路成立告成之后,通过 Dispatch 将对应的 ByteBuffer派发到指定的 Handler 长进动作静解码。用户 Handler 可以通过 NIO 线程将动静发送给客户端。

Reactor 多线程模型

Rector 多线程模型与单线程模型最大的区别就是有一组 NIO 线程措置惩罚惩罚 IO 操纵。 有专门一个NIO 线程-Acceptor 线程用于监听处事端,接收客户真个 TCP 连接请求; 网络 IO 操纵-读、写等由一个 NIO 线程池卖力,线程池可以给与标准的 JDK 线程池实现,它包罗一个任务行列队伍和 N个可用的线程,由这些 NIO 线程卖力动静的读取、解码、编码和发送;

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32784.html