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

释放双眼,带上耳机,听听看~!

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参数配置能力

给TA打赏
共{{data.count}}人
人已打赏
安全技术

详解Node.js API系列 Crypto加密模块(2) Hmac

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索