在 Dubbo 3 中,可以通过以下方式实现并发控制:
一、服务提供者端并发控制
-
executes参数限制
在服务提供者配置中限制单个方法的并发执行数:<dubbo:service interface="com.example.UserService" executes="100" />或通过注解:
@Service(executes = 100) public class UserServiceImpl implements UserService {}当并发请求超过100时,新请求会被拒绝(抛出异常)。
-
线程池配置
- 修改默认线程池大小:
dubbo: protocol: threads: 200 # 默认200线程 - 使用自定义线程池:
@Service(threadpool = "custom", threadpool = "myThreadPool") public class UserServiceImpl implements UserService {}
- 修改默认线程池大小:
二、消费者端并发控制
-
actives参数限制
限制客户端对某个方法的并发调用数:<dubbo:reference interface="com.example.UserService" actives="50" />超过50的并发请求会被阻塞等待。
-
信号量隔离
在服务端配置信号量实现轻量级并发控制:dubbo: provider: semaphore: max: 200 # 最大信号量数
三、全局流量控制
-
通过 TPS 限制
<dubbo:service interface="com.example.UserService" tps="500" />限制每秒最多处理500个请求。
-
集成 Sentinel
Dubbo 3 原生支持 Sentinel 实现熔断和流控:// 在Sentinel控制台配置规则 FlowRule rule = new FlowRule("com.example.UserService") .setCount(100) .setGrade(RuleConstant.FLOW_GRADE_QPS); FlowRuleManager.loadRules(Collections.singletonList(rule));
四、特殊场景处理
-
异步调用控制
RpcContext.getContext().setAttachment("async", "true"); // 异步标记 -
连接数限制
dubbo: protocol: accepts: 1000 # 服务端最大连接数
注意:生产环境建议结合监控(如Dubbo Admin)动态调整参数,避免硬编码值导致性能瓶颈或资源浪费。
798

被折叠的 条评论
为什么被折叠?



