Dubbo线程模型

2020/02/11 Dubbo

Dubbo线程模型

Dubbo的线程模型概述

Dubbo默认的底层网络通信使用的是Netty,服务提供方NettyServer使用两级线程池,其中EventLoopGroup(boss) 主要用来接收客户端的链接请求,并把完成TCP三次握手的连接分发给EventLoopGroup(worker)来处理,我们把boss和worker线程组称为I/O线程。

如果服务提供方的逻辑处理能迅速完成,并且不会发起新的I/O请求,那么直接在I/O线程上处理会更快,因为这样减少了线程池调度与上下文切换的开销。

但如果处理逻辑较慢,或者需要发起新的I/O请求,比如需要查询数据库,则I/O线程必须派发请求到新的线程池进行处理,否则I/O线程会被阻塞,导致不能接收其他请求。

根据请求的消息类是被I/O线程处理还是被业务线程池处理,Dubbo提供了下面几种线程模型。

  • all(AllDispatcher类):所有消息都派发到业务线程池,这些消息包括请求、响应、连接事件、断开事件、心跳事件等。
  • direct(DirectDispatcher 类):所有消息都不派发到业务线程池,全部在IO 线程上直接执行
  • message(MessageOnlyDispatcher类):只有请求响应消息派发到业务线程池,其他消息如连接事件、断开事件、心跳事件等,直接在I/O线程上执行
  • execution(ExecutionDispatcher类):只把请求类消息派发到业务线程池处理,但是响应、连接事件、断开事件、心跳事件等消息直接在I/O线程上执行
  • connection(ConnectionOrderedDispatcher类):在I/O线程上将连接事件、断开事件放入队列,有序地逐个执行,其他消息派发到业务线程池处理 在Dubbo中,线程模型的扩展接口为Dispatcher,其提供的上述扩展实现都实现了该接口,其中all模型是默认的线程模型。

Search

    微信好友

    博士的沙漏

    Table of Contents