dubbo的默认通信使用netty,netty的线程模型此文暂不讨论,我们看看dubbo在netty之后做了哪些针对线程模型的设计

dubbo与netty线程关系

默认所有请求均经过dubbo线程池执行业务逻辑
聊聊dubbo的线程模型

线程模型

NettyHandler接收到客户端请求后继续责任链处理,责任链如下
聊聊dubbo的线程模型

其中HeartbeatHandler封装的ChannelHandler句柄通过com.alibaba.dubbo.remoting.Dispatcher#dispatch返回。默认为:AllChannelHandler
Dispatcher就是我们所需要关注的责任调度器,Dispatcher通过SPI动态获取执行,官方提供的实现类有一下几种:

  1. AllDispatcher
  2. ConnectionOrderedDispatcher
  3. DirectDispatcher
  4. ExecutionDispatcher
  5. MessageOnlyDispatcher

上面的几种调度器正是对应dubbo的各种线程模型

  1. AllChannelHandler
  2. ConnectionOrderedChannelHandler
  3. ExecutionChannelHandler
  4. MessageOnlyChannelHandler

AllDispatcher

聊聊dubbo的线程模型

ConnectionOrderedDispatcher

聊聊dubbo的线程模型

DirectDispatcher

聊聊dubbo的线程模型

ExecutionDispatcher

聊聊dubbo的线程模型

MessageOnlyDispatcher

模型图同:ExecutionDispatcher

总结

  1. AllDispatcher:connected、disconnected、received、caught均使用dubbo线程池,sent不使用dubbo线程池,直接使用io线程池
  2. ConnectionOrderedDispatcher:connected、disconnected使用连接专用的"连接线程池",received、caught使用dubbo线程池,sent不使用dubbo线程池,直接使用io线程池
  3. DirectDispatcher:connected、disconnected、received、caught、sent均不使用dubbo线程池,直接使用io线程池
  4. ExecutionDispatcher:received使用dubbo线程池,connected、disconnected、sent、caught不使用dubbo线程池,直接使用io线程池。与MessageOnlyDispatcher的区别在于该模型的业务线程池满时,并且客户端使用twoway方式请求服务器,此时服务器会向客户端同步发送请求响应服务端线程池已满错误
  5. MessageOnlyDispatcher:received使用dubbo线程池,connected、disconnected、sent、caught不使用dubbo线程池,直接使用io线程池

相关文章:

  • 2022-02-12
  • 2021-06-17
  • 2021-12-30
  • 2022-12-23
  • 2021-10-10
  • 2021-12-19
  • 2021-11-11
猜你喜欢
  • 2021-10-13
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-14
  • 2021-07-04
  • 2022-01-19
相关资源
相似解决方案