dubbo的默认通信使用netty,netty的线程模型此文暂不讨论,我们看看dubbo在netty之后做了哪些针对线程模型的设计
dubbo与netty线程关系
默认所有请求均经过dubbo线程池执行业务逻辑
线程模型
NettyHandler接收到客户端请求后继续责任链处理,责任链如下
其中HeartbeatHandler封装的ChannelHandler句柄通过com.alibaba.dubbo.remoting.Dispatcher#dispatch返回。默认为:AllChannelHandler
Dispatcher就是我们所需要关注的责任调度器,Dispatcher通过SPI动态获取执行,官方提供的实现类有一下几种:
- AllDispatcher
- ConnectionOrderedDispatcher
- DirectDispatcher
- ExecutionDispatcher
- MessageOnlyDispatcher
上面的几种调度器正是对应dubbo的各种线程模型
- AllChannelHandler
- ConnectionOrderedChannelHandler
- 无
- ExecutionChannelHandler
- MessageOnlyChannelHandler
AllDispatcher
ConnectionOrderedDispatcher
DirectDispatcher
ExecutionDispatcher
MessageOnlyDispatcher
模型图同:ExecutionDispatcher
总结
- AllDispatcher:connected、disconnected、received、caught均使用dubbo线程池,sent不使用dubbo线程池,直接使用io线程池
- ConnectionOrderedDispatcher:connected、disconnected使用连接专用的"连接线程池",received、caught使用dubbo线程池,sent不使用dubbo线程池,直接使用io线程池
- DirectDispatcher:connected、disconnected、received、caught、sent均不使用dubbo线程池,直接使用io线程池
- ExecutionDispatcher:received使用dubbo线程池,connected、disconnected、sent、caught不使用dubbo线程池,直接使用io线程池。与MessageOnlyDispatcher的区别在于该模型的业务线程池满时,并且客户端使用twoway方式请求服务器,此时服务器会向客户端同步发送请求响应服务端线程池已满错误
- MessageOnlyDispatcher:received使用dubbo线程池,connected、disconnected、sent、caught不使用dubbo线程池,直接使用io线程池