服务器线程模型

Dubbo 服务提供端到端的线程池模型和使用

目前 Dubbo 协议和 Triple 协议的线程模型尚未对齐,下面分别介绍 Triple 协议和 Dubbo 协议的线程模型。

Dubbo 协议 - 提供者端线程模型

在介绍 Dubbo 协议的提供者端线程模型之前,先介绍 Dubbo 将对通道的操作抽象成五种行为

  • 建立连接:connected,主要职责是记录通道的读写时间,以及处理连接建立后的回调逻辑。例如,dubbo 支持在断开连接后自定义回调钩子(onconnect),即在该操作中实现。
  • 断开连接:disconnected,主要职责是移除通道的读写时间,以及处理连接打开后的回调逻辑。例如,dubbo 支持在断开连接后自定义回调钩子(ondisconnect),即在该操作中实现。
  • 发送消息:sent,包括发送请求和发送响应。记录写时间。
  • 接收消息:received,包括接收请求和接收响应。记录读时间。
  • 异常捕获:caught,用于处理通道上发生的各种异常。

Dubbo 框架的线程模型与上述五种行为密切相关。Dubbo 协议 Provider 的线程模型可以分为五类,分别是 AllDispatcher、DirectDispatcher、MessageOnlyDispatcher、ExecutionDispatcher 和 ConnectionOrderedDispatcher。

All Dispatcher

下图是 All Dispatcher 的线程模型示意图

dubbo-provider-alldispatcher

  • IO 线程中执行的操作是
    1. sent 操作在 IO 线程上执行。
    2. 序列化响应在 IO 线程上执行。
  • Dubbo 线程中执行的操作是
    1. received、connected、disconnected 和 caught 都在 Dubbo 线程上执行。
    2. 反序列化请求的行为在 Dubbo 中完成。

Direct Dispatcher

下图是 Direct Dispatcher 的线程模型示意图

dubbo-provider-directDispatcher

  • IO 线程中执行的操作是
    1. received、connected、disconnected、caught 和 sent 操作都在 IO 线程上执行。
    2. 反序列化请求和序列化响应都在 IO 线程上执行。
    1. 它不操作 Dubbo 线程。

Execution Dispatcher

下图是 Execution Dispatcher 的线程模型示意图

dubbo-provider-ExecutionDispatcher

  • IO 线程中执行的操作是
    1. sent、connected、disconnected 和 caught 操作都在 IO 线程上执行。
    2. 序列化响应在 IO 线程上执行。
  • Dubbo 线程中执行的操作是
    1. received 在 Dubbo 线程上执行。
    2. 反序列化请求的行为在 Dubbo 中完成。

Message Only Dispatcher

在 Provider 端,Message Only Dispatcher 和 Execution Dispatcher 的线程模型一致,所以下图与 Execution Dispatcher 一致,区别在于 Consumer 端。请参见下面 Consumer 端的线程模型。

下图是 Message Only Dispatcher 的线程模型示意图

dubbo-provider-ExecutionDispatcher

  • IO 线程中执行的操作是
    1. sent、connected、disconnected 和 caught 操作都在 IO 线程上执行。
    2. 序列化响应在 IO 线程上执行。
  • Dubbo 线程中执行的操作是
    1. received 在 Dubbo 线程上执行。
    2. 反序列化请求的行为在 Dubbo 中完成。

Connection Ordered Dispatcher

下图是 Connection Ordered Dispatcher 的线程模型示意图

dubbbo-provider-connectionOrderedDispatcher

  • IO 线程中执行的操作是
    1. sent 操作在 IO 线程上执行。
    2. 序列化响应在 IO 线程上执行。
  • Dubbo 线程中执行的操作是
    1. received、connected、disconnected 和 caught 都在 Dubbo 线程上执行。但 connected 和 disconnected 这两种行为通过线程池与另外两种行为隔离。并且在 Dubbo connected 线程池中,提供了链接限制和预警灯功能。
    2. 反序列化请求的行为在 Dubbo 中完成。

Triple 协议——提供者端线程模型

下图显示了 Triple 协议的提供者端的线程模型

triple-provider

Triple 协议的提供者线程模型目前比较简单。目前,序列化和反序列化操作在 Dubbo 线程上进行,而 IO 线程不承担这些任务。

如何调整线程模型

以 yaml 配置方法为例:在 protocol 下配置 dispatcher: all,将 dubbo 协议的线程模型调整为 All Dispatcher

dubbo:
  application:
    name: dubbo-springboot-demo-provider
  protocol:
    name: dubbo
    port: -1
    dispatcher: all
  registry:
    id: zk-registry
    address: zookeeper://127.0.0.1:2181
  config-center:
    address: zookeeper://127.0.0.1:2181
  metadata-report:
    address: zookeeper://127.0.0.1:2181

每个线程模型的配置值

  • 所有调度器 all - 直接调度器 direct
  • 执行调度器 execution
  • 仅消息调度器: message
  • 连接有序调度器: connection

上次修改时间:2023年1月2日:增强 en 文档 (#1798) (95a9f4f6c1c)