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 条评论
 下一页
  
  
  
  
  
  
  
  
  
 