netty知识框架笔记
2022-10-19 17:10:11 0 举报
AI智能生成
netty知识框架笔记
作者其他创作
大纲/内容
<br>
handler和childHandler
半链接+全链接队列总和
默认100
一个accpet时从全链接队列获取一个
backlog参数
serverChannelOption
控制读取操作阻塞多少毫秒,0为无限阻塞
SO_TIMEOUT
发送缓冲区大小
SO_SNDBUF
接收缓冲区大小
SO_RCVBUF
用于决定如何网络上仍有数据向旧ServerSocket传输数据,是否允许新的ServerSocket绑定到相同的端口上
SO_REUSEADDR
客户端连接超时时间
CONNECT_TIMEOUT_MILLIS
TCP_NODELAY
childChannelOption
option
长度固定,容量不能动态扩展收缩,出现数组越界
只有一个位置标识指针,读写转换时要手动调用flip()
api功能有限
原生Bytebuffer缺点
flip操作后
flip操作前
flip()
典型用法
Bytebuffer
写入
读取
discardRead
clear
指针
返回当前ByteBuf新创建的子区域,与原Bytebuf共享缓冲区,但是独立维护自己的readIndex和writeIndex。新建的子区域readIndex为0,wirteIndex为length<br>
readSlice(int length)
wirteZero(int length)
readerIndex和writeIndex
会造成内存复制,频繁调用会导致性能下降<br>
discardable bytes
不清空缓冲区本身,主要是将readIndex和writeIndex还原初始位置
Clear操作
Mard Reset
返回当前byteBuf的复制对象,共享一个缓冲区,但是独立维护读写索引
duplicate
复制一个新的byteBuf索引和内容都是新的
copy
返回当前byteBuf可读子区域,与原始缓冲区内容共享,读写下标独立维护
slice
Derived buffer
set/get随机读写
indexOf
bytesBefore
forEachBytes
查找
内置方法
基于堆内存分配回收速度快,缺点是需要额外一次内存copy
HeapByteBuf
堆外内存分配,分配回收速度慢,0copy
DirectByteBuf
池化使用了对象池技术,减少gc,但是会带来额外维护开销
池化/非池化
<span style="font-size: inherit;">门限4MB,新申请的容量大于4m小于maxCap时以4m的大小增长,小于4m时则以64的倍数进行增长</span><br>
动态扩容
由多个chunk组成
PoolArena
由多个page组成,以二叉树形式存储
chunk
page
对象池
bytebuf容器
byteBufHolder
bytebufAllocator
将多个bytebuf组装到一起,形成统一视图
CompositeBytebuf
encodeString
decodeString
hexDump
BytebufUtil
辅助类
Bytebuf
Mac
进程id
当前系统时间毫秒
当前系统时间纳秒
32位随机整数
32位自增序列
id生成策略
channel
过程
channel注册事件
ChannelRegistered()
Tcp链路建立成功,channel激活
channelActive
channelread
读完成
channelReadComplete
exceptionCauth
用户自定义
userEventTriggered
写状态变化时
channelWriabilityChanged
channelInactive
事件
@Sharable
@Skip
注解
ChannelHandlerAdapter
ByteToMessageDecoder
二次解码器,将一个对象解码成其他对象
MessageToMessageDecoder
lengthFieldBasedFrameDecoder
LengthFiledPrepender
chanelHandler
ChannelPipline
阻塞IO
非阻塞IO
IO多路复用
信号驱动模型
异步IO
unix五种网络模型
write写入字节大于sendBuffer大小
进行MSS大小的Segment分段
以太网帧的payload大于MTU
发生原因
消息定长
消息尾分隔符
分为消息头消息体,头中包含消息长度
解决策略
LineBasedFrameDecoder
FixedLengthFrameDecoder
DelimiterBasedFrameDecoder
tcp粘包
MsgpackDecoder
MsgpackEncoder
ProtobufDecoder
ProtobufEncoder
ProtobufVarint32FrameDecoder(处理半包)
ProtobufVarint32LengthFieldPrepender(处理半包)
第三方序列化框架的支持
HttpRequestDecoder
HttpObjectAggregator(将多个消息转化为单一的FullHttpRequest或FullHttpResponse)
HttpResponseEncoder
ChunkedWriteHandler(支持异步发送较大的码流如大文件传输)
http协议支持
HttpServerCodeC
WebSocketServerHandshaker
WebSocket协议支持
接收客户端连接
向服务端发起连接
读取请求或者应答
发消息或者应答
nio线程职责
Reactor单线程
专门的nio线程接收客户端请求(单线程)
读写也有专门的线程池负责
一个NIO线程同时处理n条链路,一个链路对应一个nio线程
特点
Reactor多线程
与多线程reactor相比,使用线程池接收客户端请求
主从Reactor多线程
不要在channelHandler中启动用户线程
解码要放在NIO线程调用解码Handler中进行,不要切换到用户线程完成
如果业务操作简单,可以直接在NIO线程上完成逻辑
如果业务复杂耗时,可封装成task发到业务线程池中完成
最佳实践
eventLoop
netty知识框架笔记
0 条评论
回复 删除
下一页