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