Netty Reactor设计图
2021-06-15 15:50:30 0 举报
Netty流程
作者其他创作
大纲/内容
NioServerSocketChannel初始化完Pipeline状态
NioServerSocketChannel
step2:processSelectedKeys
2. Chooser:从Group中选择一个NioEventLoop线程。有点负载均衡的意思,尤其对于WorkGroup来说。
消息发送五种策略:1.如果ChannelOutboundBuffer中待发送消息只有一个ByteBuf,若不能写,注册写事件退出,否则调用socketchannel写到TCP发送缓冲区。2.如果ChannelOutboundBuffer中待发送消息有多个ByteBuf,若不能写,注册写事件退出,否则调用socketchannel的批量发送接口span style=\"font-size: inherit;\
TaskQueue
Entry
TailTasks
5.TaskQueue: Netty会把服务启动过程划分成一个个任务,比如Channel注册Selector上、添加Handler、地址绑定;然后交给Reactor线程去执行。典型的线程+队列模式异步提高性能。
三、主从Reactor工作流程
NioEventLoop
ChannelPipeline
1.2 register
ServerBootstrapAcceptor
Client
2. doBind0
Head
3.绑定地址
2.添加ServerBootstrapAcceptor
ChannelInitializer
Tail
step1:select
NioEventLoop个数为cpu核心数的2倍
step3:runAllTasks
第二个任务执行完Pipeline状态
ChannelHandler
...
unflushedEntry
Chooser
读写事件
ChannelHandlerContext
head
doWrite()
Netty Reactor架构图
Pipeline
1.从队列中取任务完成SocketChannel注册到Selector上;2.pipeline中添加业务Handler。3.调用pipeline.fireChannelReadComplete(),完成OP_READ感兴趣事件绑定。
TailChannelHandler
1. 构建NioSocketChannel对象,流程和ServerSocketChannel一样。
。。。
work Group
一、NioEventLoopGroup初始化数据模型
tailEntry
1.当完成NioEventLoopGroup初始化后,server端数据模型如图所示。注意:这时候NioEventLoop线程并没有启动。
Executor
ServerSocketChannel
1.1 init
Channel
连接事件
WriteTask
flushedEntry
addFlush()
2.调用pipeline.fireChannelRead方法传播到ServerBootstrapAcceptor的channelRead方法,从workGroup中选择一个NioEventLoop线程,将注册功能封装成任务,添加到TaskQueue队列中,然后启动线程。
4. Selector: Reactor最主要的模块,通过选择发生的事件注册到Channel上,进行通信。
二、Bind流程
Work Group
tail
ServerSocketChannel绑定地址;至此,服务端流程启动完成
业务ChannelHandler的耗时任务可以封装成task放到TaskQueue中,让NioEventLoop线程处理。
HeadChannelHandler
1. 通过反射new NioServerSocketChannel对象。2. NioServerSocketChannel我们设置的参数进行初始化。3. 向channel的pipeline中添加辅助处理器ChannelInitializer,后续利用他的initChannel方法添加处理器。
bind端口
readInterestOp
<writeSpinCount=16循环写
Selector
业务ChannelHandler
1.register任务
UnSafe
1. initAndRegister
四、Channel 和 ChannelPipeline 、ChannelHandlerContext关系
Boss Group
addMessage()
1. 通过Chooser选择一个reactor线程。2. 对注册行为封装成一个任务,交给reactor线程。3. 添加到TaskQueue队列中。4. 启动reactor线程,进入Reactor模型逻辑。
注意这里能直接写到操作系统中,而不是JVM中,是因为头结点(发送和接受)用的Buffer是堆外内存(零拷贝),pipeline内部传播使用的是堆内内存。
3. Executor: 当调用executor.execute方法就会开启reactor线程
WriteAndFlush方法从尾结点传播,invokeWrite0先写数据一直传播到头结点的ChannelOutboundBuffer链表中
ChannelOutboundBuffer
收藏
收藏
0 条评论
下一页