dubbo底层之Netty

背景算法

  1. Java线程:由开始的单线程,到经过new Thread()建立的多线程,再到现现在的线程池,Java多线程编程的效率和性能有了很大的提高
  2. Reactor模型:基于事件驱动,适合处理海量I/O事件

    1)  单线程模型,全部的IO操做都在一个NIO线程上完成编程

    存在性能和可靠性上的问题数组

    2)  多线程模型,有一组NIO线程处理IO操做安全

    有一个专门的NIO线程-Acceptor线程用于监听服务端,接收客户端的TCP链接请求;多线程

    有一个NIO线程池,负责消息的读取、发送、编码、解码;并发

    一个NIO线程能负责N条链路,一条链路只能由一个线程负责(防止发生并发操做问题)负载均衡

    3)  主从多线程模型框架

    添加主线程池用于处理客户端的链接请求,一旦链路创建成功(通过握手、认证等过程),就将链路注册到从线程池的IO线程上,由IO线程负责后续的IO操做异步

Netty线程模型oop

  1.线程模型分类

    1)  服务端线程模型,相似于Reactor的多线程模型

    2)  客户端线程模型:由客户端建立SocketChannel,发起链接,线程池判断链接结果,若是链接成功,则监听读操做位,不然监听链接操做位,一旦链接成功就监听读操做位

  2.Reactor线程NioEventLoop

    1)  做为服务端Acceptor线程,处理客户端的链接请求

    2)  做为客户端的connector,注册监听链接操做位,判断异步链接结果

    3)  做为IO线程,监听读操做位,负责从SorcketChannel中读取报文

    4)  做为IO线程,监听写操做位,负责向SocketChannel写入报文发送给对方

    5)  做为定时线程,执行定时任务(链路空闲检测,心跳检测)

    6)  做为线程执行器,能够执行普通的任务线程

  3.NioEventLoop设计原理

    1)  串行化设计理念:NioEventLoop线程池中有若干个NioEventLoop线程,每个NioEventLoop线程串行执行Handler链;每当有一个客户端接入,从线程池中获取一个可用的NioEventLoop线程,当数组到达上限以后,从0开始(负载均衡);每一个客户端链接一个线程,这样保证了数据的安全性(避免多个线程同时访问)

    2)  定时任务和时间轮算法:客户端链接超时,链路空闲检测

    Netty的定时任务调度就是基于时间轮调度算法,首先查看任务队列中是否有超时的定时任务或者普通任务,有则执行(按照时间片原则分配运行时间),没有就等待定时任务中延迟最小的任务(即即将第一个超时的任务)的延迟时间,而后将扫描定时任务,将超时的定时任务加入任务队列,在任务执行时,Netty每执行64个定时任务就检测一次是否达到执行时间上限,达到则退出,若是没有执行完就放到下次轮询时再处理。

    3)  Netty是个异步高性能NIO框架,不是业务处理容器,不须要也不该该提供业务容器和业务线程,,只须要提供和管理NIO线程,关于业务层模型由用户本身集成。

Netty结构

 

PS:图中有一点修正一下,SocketChannel是创建在客户端与服务端之间的,EventLoopGroup线程池中的一个线程与SocketChannel绑定,在服务端后续的线程处理以前,须要从SocketChannel中读取参数,在处理以后,须要向SocketChannel中写入处理结果。

Dubbo通讯层(利用Netty)的实现过程

 

相关文章
相关标签/搜索