这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
Netty作为一个开发可维护的高性能协议服务器和客户端的网络应用程序框架,它具备了以下的特性:
- 设计上提供统一的API,并且基于具备灵活、可拓展的事件驱动模型
- 性能上,有着高吞吐量、低延迟,低耗能,零拷贝等优点
- 安全上,完整的SSL/TLS和STARTTLS的支持
- 健壮性也有保证,不会因为异常导致OOM(内存溢出)
- 易用也是一方面,有完善的JavaDoc,容易上手使用
Netty高性能的原因
异步非阻塞通信
Netty对JDK自带的NIO的API进行封装 Netty架构按照Reactor模式设计和实现
零拷贝
定义:
"Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another.(“零拷贝”是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。)
- Netty基于Zero-copy"的实现:
- Netty的接收和发送ByteBuffer采用DIRECT BUFFERS。
- Netty 提供 CompositeByteBuf 类。
- 通过 FileRegion 包装的FileChannel.tranferTo方法 实现文件传输。
- 通过 wrap 操作, 我们可以将 byte[] 数组、ByteBuf、ByteBuffer等包装成一个 Netty ByteBuf 对象, 进而避免了拷贝操作。
内存池
Netty提供了基于内存池的缓冲区重用机制,尽量实现了重用缓冲区的效果
内存分级从上到下主要分为:Arena,ChunkList,Chunk,Page,SubPage五级,PooledArena是一块连续的内存块,为了优化并发性能在Netty内存池中存在一个由多个Arena组成的数组,在多个线程进行内存分配时会按照轮询策略选择一个Arena进行内存分配
高效的Reactor线程模型
可参考之前的文章 初识Netty系列——Reactor模式
无锁化的串行设计理念
通过串行化设计,让消息的处理尽可能在同一个线程内完成,避免了并发多线程的使用时,对于共享资源的并发访问造成的锁竞争
高效的并发编程
- volatile的大量、正确使用
- CAS和原子类的广泛使用
- 线程安全容器的使用
- 通过读写锁提升并发性能
高性能的序列化框架
Netty默认提供了对Google Protobuf的支持,通过扩展Netty的编解码接口,用户可以实现其它的高性能序列化框架
灵活的TCP参数配置能力
Netty在启动辅助类中可以灵活的配置TCP参数,满足不同的用户场景