场景- 性能要求高的系统
需求- 高性能实现需求
实现- netty
应用- 使用Netty异步非阻塞NIO框架实现
原理:
** 传统RPC调用性能问题**
1 、阻塞IO导致高并发使服务器宕机
2 、JAVA序列化编、解码导致性能问题(序列化跨语言问题)
3、 CPU占用率高
高性能关键
IO模型-数据协议-线程模型-IO模型
一:高性能的理由
1 Netty在NIO基础上的异步非阻塞通信
NioEventLoop聚合了多路复用器Selector(多个IO阻塞、复用到同一个Selector上、实现系统在单线程情况下,可处理多线程,已实现减少系统开销),可同时并发处理成百上千个客户端channel,切读写操作都是非阻塞,可充分提高IO线程的运行效率,避免IO阻塞导致线程挂起。
2 零拷贝
1 接受和发送ByteBuffer都使用堆外直接内存进行socket读写
2 提供组合buffer对象,可聚合多个buffer
3 transferTo()直接将文件缓冲区的数据发送到Channel
3 内存池
三个维度:
1 Pooled和UnPooled
2 UnSafe和 非UnSafe(底层读写(高性能)与应用程序读写)
3 Heap和Direct(堆内存和堆外内存)
4 高效的Reactor(类似线程池、具有调度作用)线程模型
1 Reactor单线程模型
2 Reactor多线程模型,一个线程接受所有连接,然后放入线程池中(接收到连接后,由Reactor在一个线程池(包含任务队列和N个可用线程)中分配一个线程,负责IO读写,编解码,发送等)
如果接收线程还有很多逻辑处理,比如需要安全认证等、太消耗性能,这样单线程接受,容易出问题。可使用下面的模型
3 主从Reactor多线程模型
Reactor主线程具体派发线程去处理不同逻辑
5 无锁化的串行设计理念
pipeline 责任链模式-双向链表 Inbound Outbound
6 高效的并发编程
Netty的高效并发编程主要体现:
1 volatile的大量、正确应用
2 CAS和原子类的广泛使用
3 线程安全容器的使用
4 通过读写锁提高并发性能
7 高性能的序列化框架介入
影响序列化性能因素关键
1 序列化后的码流大小(网络带宽占用)
2 序列化&反序列化的性能(CPU资源占用)
3 是否支持跨语言(异构系统的对接和发开语言的切换)
8 灵活的TCP参数配置能力