dubbo线程模型

本文探讨了线程模型中不同派发策略与线程池配置的组合应用,如all、direct、message、execution和connection策略,以及fixed、cached、limited和eager线程池类型,以优化事件处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程模型

如果事件处理的逻辑能迅速完成,并且不会发起新的 IO 请求,比如只是在内存中记个标识,则直接在 IO 线程上处理更快,因为减少了线程池调度。

但如果事件处理逻辑较慢,或者需要发起新的 IO 请求,比如需要查询数据库,则必须派发到线程池,否则 IO 线程阻塞,将导致不能接收其它请求。

如果用 IO 线程处理事件,又在事件处理过程中发起新的 IO 请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。

在这里插入图片描述

因此,需要通过不同的派发策略和不同的线程池配置的组合来应对不同的场景:

<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />

Dispatcher

(1)all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。
(2)direct 所有消息都不派发到线程池,全部在 IO 线程上直接执行。
(3)message 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在 IO 线程上执行。
(4)execution 只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在 IO 线程上执行。
(5)connection 在 IO 线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。

ThreadPool

(1)fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
(2)cached 缓存线程池,空闲一分钟自动删除,需要时重建。
(3)limited 可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题。
(4)eager 优先创建Worker线程池。在任务数量大于corePoolSize但是小于maximumPoolSize时,优先创建Worker来处理任务。当任务数量大于maximumPoolSize时,将任务放入阻塞队列中。阻塞队列充满时抛出RejectedExecutionException。(相比于cached:cached在任务数量超过maximumPoolSize时直接抛出异常而不是将任务放入阻塞队列)

### Dubbo 客户端线程模型架构与工作原理 Dubbo客户端的线程模型设计旨在高效处理远程服务调用并管理并发请求。通过自适应扩展机制,可以根据URL参数动态调整线程池配置[^1]。 #### 线程池初始化 当启动Dubbo消费者应用时,会依据配置文件或默认设置创建线程池实例。此过程涉及解析`dubbo.consumer.threadpool`属性及其关联参数,如核心线程数(`corethreads`)、最大线程数(`maxthreads`)等。这些设定直接影响后续RPC调用期间资源分配策略。 ```properties # 配置示例 dubbo.consumer.threadpool=fixed dubbo.consumer.corethreads=200 dubbo.consumer.maxthreads=1000 ``` #### 请求提交流程 每当发起一次远端方法调用(DemoService.sayHello()),实际执行路径如下: - **代理对象**接收到API接口调用后封装成Invocation对象; - 调度器根据负载均衡算法挑选合适的服务提供方节点; - 将准备好的消息体发送至目标地址前,先经过过滤链(Filter Chain)做预处理操作; - 最终由Transporter负责建立物理连接并向对方传递二进制流数据; 在此过程中,所有异步任务均交予预先构建好的ExecutorService来承担,确保主线程不会因等待响应而阻塞过久。 #### 响应回调机制 一旦网络层确认已成功送达指令包,则立即触发监听事件通知业务逻辑继续推进。此时如果启用了Future模式,则允许应用程序提前返回临时结果给前端展示,待真正完成后再更新最终状态。 对于同步场景,默认情况下将一直挂起直到获得确切答复为止。不过得益于灵活可配的超时控制选项,可以有效防止长时间无回应造成的死锁现象发生。 ```java // Java代码片段示意如何使用CompletableFuture优雅地处理异步回调 public CompletableFuture<String> asyncSayHello(String name){ return RpcContext.getContext().getCompletableFuture(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值