Dubbo的线程模型(三)

本文围绕Dubbo线程模型展开,指出官网示意图可能有误。介绍了不同任务场景下任务应由I/O线程还是线程池处理,如无耗时操作可由I/O线程处理,有耗时操作则分发给线程池。还阐述了Dubbo线程模型配置的两个主要方面,包括Dispather取值和线程池参数及类型。

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

1、参考

线程模型:http://dubbo.apache.org/en-us/docs/user/demos/thread-model.html

2.1、线程模型

官网示意图:

dubbo-protocol

我个人觉得这个图可能画错了,左边的Proxy与Client是不是应该倒换一下。

关于线程模型的几个点:

  • 如果任务不包括耗时操作如各种I/O或者是大量的计算,只在内存中就可很快完成,则任务应该由I/O线程直接执行,而不是分发给线程池。本质上就是I/O线程工作在非阻塞模式,当I/O没有就绪时,线程无事可干,顺道处理一些小任务。
  • 如果任务需要耗时的I/O操作,或者计算量很大,则应该分发给线程池。如果I/O线程处理此类任务,就会耽误它的主业,就是从网络上读写数据。
  • 如果用 IO 线程处理任务,又在任务处理过程中发起新的 IO 请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。直接点说,如果任务在处理过程中会发起新的I/O请求,那么,一定要把它交给线程池处理就行了。

Dubbo中线程模型的配置两个主要的方面,一个是配置Dispather,决定这个任务应该由I/O线程或者线程池谁来处理。第二个就是线程池的一些参数,初始多少线程、最大多少、最小多少等。示例:

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

dispatcher的取值,发现一个事,配置里是dispacher这个词,上图中写的是dispather。

  • all: 请求全部交给线程池。
  • direct: 请求全部由I/O线程处理。
  • message: 原文(Only request, response messages will be dispatched to I/O thread.),应该是写错了,只有request、response消息分发给线程池,其它如disconnect, connect, heartbeat等由I/O纯种处理。
  • execution: 只有request消息分发给线程池,其它一律I/O线程。
  • connection: I/O线程也有一个对列,把disconnect、connect任务放在队列里,有空的时候去处理一下,其它一律线程池。

threadpool取值:

  • fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
  • cached 缓存线程池,空闲一分钟自动删除,需要时重建。
  • limited 可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题。
  • 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、付费专栏及课程。

余额充值