Java异步NIO框架Netty实现高性能高并发

来源:互联网 发布:游戏开发数据库 编辑:程序博客网 时间:2024/04/28 11:38

RPC包括:消息的编码、解码、读取和发送; 

转自:http://blog.csdn.net/woshisap/article/details/74022825
本文是对上述文章的总结、精简。
2.1. RPC调用的性能模型分析
2.1.1. 传统RPC调用性能差的三宗罪
网络传输方式问题;序列化方式问题;线程模型问题;
2.1.2. 高性能的三个主题
1) 传输;2) 协议;3) 线程
2.2. Netty高性能之道
2.2.1. 异步非阻塞通信
Netty的IO线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个客户端Channel,由于读写操作都是非阻塞的,这就可以充分提升IO线程的运行效率,避免由于频繁IO阻塞导致的线程挂起
2.2.2. 零拷贝
1) Netty的接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝
2) Netty提供了组合Buffer对象,可以聚合多个ByteBuffer对象,用户可以像操作一个Buffer那样方便的对组合Buffer进行操作
3) Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel
2.2.3. 内存池
对于缓冲区Buffer,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty提供了基于内存池的缓冲区重用机制
性能测试表明,采用内存池的ByteBuf相比于朝生夕灭的ByteBuf,性能高23倍左右(性能数据与使用场景强相关)。
2.2.4. 高效的Reactor线程模型
常用的Reactor线程模型有三种,分别如下:
1) Reactor单线程模型;
2) Reactor多线程模型;
3) 主从Reactor多线程模型
2.2.5. 无锁化的串行设计理念
可以通过串行化设计,即消息的处理尽可能在同一个线程内完成,期间不进行线程切换,这样就避免了多线程竞争和同步锁。通过调整NIO线程池的线程参数,可以同时启动多个串行化的线程并行运行,这种局部无锁化的串行线程设计相比一个队列-多个工作线程模型性能更优。
2.2.6. 高效的并发编程
Netty的高效并发编程主要体现在如下几点:
1) volatile的大量、正确使用;
2) CAS和原子类的广泛使用;
3) 线程安全容器的使用;
4) 通过读写锁提升并发性能。
2.2.7. 高性能的序列化框架
影响序列化性能的关键因素总结如下:
1) 序列化后的码流大小(网络带宽的占用);
2) 序列化&反序列化的性能(CPU资源占用);
3) 是否支持跨语言(异构系统的对接和开发语言切换)。
Netty默认提供了对Google Protobuf的支持
2.2.8. 灵活的TCP参数配置能力