服务器线程模型
目前 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 的线程模型示意图
- IO 线程中执行的操作是
- sent 操作在 IO 线程上执行。
- 序列化响应在 IO 线程上执行。
- Dubbo 线程中执行的操作是
- received、connected、disconnected 和 caught 都在 Dubbo 线程上执行。
- 反序列化请求的行为在 Dubbo 中完成。
Direct Dispatcher
下图是 Direct Dispatcher 的线程模型示意图
- IO 线程中执行的操作是
- received、connected、disconnected、caught 和 sent 操作都在 IO 线程上执行。
- 反序列化请求和序列化响应都在 IO 线程上执行。
- 它不操作 Dubbo 线程。
Execution Dispatcher
下图是 Execution Dispatcher 的线程模型示意图
- IO 线程中执行的操作是
- sent、connected、disconnected 和 caught 操作都在 IO 线程上执行。
- 序列化响应在 IO 线程上执行。
- Dubbo 线程中执行的操作是
- received 在 Dubbo 线程上执行。
- 反序列化请求的行为在 Dubbo 中完成。
Message Only Dispatcher
在 Provider 端,Message Only Dispatcher 和 Execution Dispatcher 的线程模型一致,所以下图与 Execution Dispatcher 一致,区别在于 Consumer 端。请参见下面 Consumer 端的线程模型。
下图是 Message Only Dispatcher 的线程模型示意图
- IO 线程中执行的操作是
- sent、connected、disconnected 和 caught 操作都在 IO 线程上执行。
- 序列化响应在 IO 线程上执行。
- Dubbo 线程中执行的操作是
- received 在 Dubbo 线程上执行。
- 反序列化请求的行为在 Dubbo 中完成。
Connection Ordered Dispatcher
下图是 Connection Ordered Dispatcher 的线程模型示意图
- IO 线程中执行的操作是
- sent 操作在 IO 线程上执行。
- 序列化响应在 IO 线程上执行。
- Dubbo 线程中执行的操作是
- received、connected、disconnected 和 caught 都在 Dubbo 线程上执行。但 connected 和 disconnected 这两种行为通过线程池与另外两种行为隔离。并且在 Dubbo connected 线程池中,提供了链接限制和预警灯功能。
- 反序列化请求的行为在 Dubbo 中完成。
Triple 协议——提供者端线程模型
下图显示了 Triple 协议的提供者端的线程模型
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