Netty
2023-11-01 22:37:46 0 举报
AI智能生成
Netty 源码解读
作者其他创作
大纲/内容
概念
定义
特性
架构
性能
安全
易用性
架构
系统架构
Core(核心层):底层网络通信抽象
网络通信层
Bootstrap
Channel
事件调度层
EventLoopGroup
EventLoop
服务编排层
Protocal Support(协议支持层):主流协议编解码
Transport Service(传输服务层):传输服务通用实现
设计
网络通讯
事件模型 & 通讯API
网络通讯
引导器
Channel
Selector
事件调度(事件驱动)
Reactor 线程模型
单线程
多线程
多Reactor
EventLoop
事件轮询:select
事件处理:processSelectedKeys
Accept 事件
Resister事件
Read/Write事件
任务处理:runAllTasks
普通任务:通过 NioEventLoop 的 execute() 方法向任务队列 taskQueue 中添加任务
定时任务:通过 NioEventLoop 的 schedule() 方法向定时任务队列 scheduledTaskQueue 添
加任务
加任务
尾部队列:在每次执行完 taskQueue 中任务后会去获取尾部队列中任务执行
服务编排
ChannelPipeline
ChannelHandlerContext
ChannelHandler
ChannelInboundHandler
ChannelOutboundHandler
ExceptionHandler
协议支持:Protocal Support
拆包 / 粘包
Why:TCP 传输协议是面向流的,没有数据包界限
MTU :传输单元大小
MSS:最大分段大小
滑动窗口
Nagle 算法
What
How:应用层自己解决
协议实现
消息长度固定
优点:简单
缺点:无法预知消息长度,太长导致字节浪费,太短影响消息传输
特定分隔符
缺点:仅适用于简单消息协场景,如Redis
消息长度 + 消息内容
编码
对象编码成字节流:MessageToByteEncoder
一种消息类型编码成另外一种消息类型:MessageToMessageEncoder
解码
字节流解码为对象:ByteToMessageDecoder
一种消息类型解码为另外一种消息类型:MessageToMessageDecoder
传输服务:Transport Service
In-VM Pipe
Socket & Datagram
HTTP
内存管理
Zero Copy
动机:减少 CPU 拷贝
实现:见 RocketMQ
堆外内存
动机:避免 JVM 堆内存到堆外内存的数据拷贝
实现
分配
ByteBuffer#allocateDirect
Unsafe#allocateMemory
回收
最佳实践
避免物理内存被耗尽:-XX:MaxDirectMemorySize 指定堆外内存上限
ByteBuf
ByteBuf
CompositeByteBuf
动机:通过逻辑组合,避免物理拷贝
实现
CompositeByteBuf 结构
Component 结构
内存管理算法
动机
1、高效分配、回收内存,提升多线程并发场景
2、减少内存碎片,提升内存有效利用率
内部碎片
外部碎片
常见内存分配算法
动态内存分配:程序运行时,按需分配
⾸次适应算法(first fit)
循环适应算法(next fit)
最佳适应算法(best fit)
伙伴算法
Slab 算法
实现
ptmalloc:每个线程都独⽴使⽤各⾃的内存
tcmalloc:每个线程分配了⼀个局部缓存
jemalloc
整体设计
内存规格
PoolArena
默认数量与CPU核数有关
线程轮询选择Arena
PoolChunk
PoolChunkList
PoolChunk 选择算法
PoolChunk:伙伴算法
PoolSubPage:Slab 算法
PoolSubPage 与 PoolArena 关联
PoolThreadCache & MemoryRegionCache
Recycler 对象池化
动机:池化对象,避免创建、销毁对象
实现
当前线程对象回收:Stack
子线程对象回收:WeakOrderQueue
并发
MPSC
0 条评论
下一页