netty的高性能之道
2020-03-28 本文已影响0人
剑道_7ffc
背景介绍
Netty 惊人的性能数据
使用Netty(NIO框架)相比于BIO性能提升8倍
传统RPC调用性能差的三宗罪
![](https://img.haomeiwen.com/i5359801/f465b1c3d45002d1.png)
网络传输方式问题:同步阻塞
序列化方式问题:Bio使用的是java自身的序列化,而java自身的序列化存在序列化性能差,无法支持跨语言,序列化后的文件大等问题。
线程模型问题:因为为每个连接创建一个线程,而一台机器的最大线程数是受限的,会导致线程过多时,执行效率的下降和超过最大线程数的机器宕机。
高性能的三个主题
传输:使用什么通道将数据传给对方,如BIO,NIO,AIO,IO模型的不同决定着性能的不同。
协议:采用什么通信协议,如共有协议或自定义协议等
线程:线程模型如BIO的连接和线程一对一的模型和Reactor线程模型
![](https://img.haomeiwen.com/i5359801/34b14f8a43daec4a.png)
Netty 高性能之道
异步非阻塞通信
在处理多个客户端请求时,可以采用多线程或IO多路复用技术来处理,IO多路复用是把多个IO的阻塞复用到一个Select的阻塞,使单线程可以处理多个客户端请求。
NIO通信模型如下
![](https://img.haomeiwen.com/i5359801/87ee1d32bd1baecc.png)
Netty 架构按照 Reactor 模式设计和实现,它的服务端通信序列图如下:
![](https://img.haomeiwen.com/i5359801/8f2d68b6fe975823.png)
客户端通信序列图如下:
![](https://img.haomeiwen.com/i5359801/5283ab3cc9a55dc4.png)
零拷贝
内存池
缓冲区重用机制
高效的 Reactor 线程模型
常用的 Reactor 线程模型有三种,分别如下:
1 Reactor 单线程模型;
![](https://img.haomeiwen.com/i5359801/b225ada30b3d10bf.png)
2 Reactor 多线程模型
![](https://img.haomeiwen.com/i5359801/8bde7fe583c9e64f.png)
3 主从 Reactor 多线程模型
![](https://img.haomeiwen.com/i5359801/62644f55fc6bcecb.png)
无锁化的串行设计理念
![](https://img.haomeiwen.com/i5359801/b2cf940d9aa5674f.png)
高效的并发编程
高性能的序列化框架
Netty 默认提供了对 Google Protobuf 的支持,通过扩展 Netty 的编解码接口,用户可以实现其它的高性能序列化框架,
灵活的 TCP 参数配置能力
合理设置 TCP 参数在某些场景下对于性能的提升可以起到显著的效果。