阿里dubbo出错提示Thread pool is EXHAUSTED问题及解决方法
问题描述
在使用阿里dubbo进行分布式服务调用时,可能会出现 Thread pool is EXHAUSTED
的错误提示,如下所示:
Exception in thread "main" org.springframework.remoting.RemoteAccessException: Could not access RMI service [rmi://localhost:1099/com.xxx.YourService]; nested exception is java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED!
这个错误提示主要是因为默认的dubbo线程池队列长度为100,如果同时有多个请求,队列满了后线程池就会抛出RejectedExecutionException异常,提示线程池耗尽。
解决方法
- 增加线程池队列长度
可以通过在dubbo配置文件中添加<dubbo:protocol />
配置来修改线程池队列长度(例如设置为200):
<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" queues="200" />
- 修改线程池类型
如果需要更高的并发能力,还可以将线程池类型改为ThreadPoolExecutor(默认是JdkThreadPoolExecutor),并通过自定义ThreadPoolExecutor.AbortPolicy
来限制任务的提交(例如设置抛出异常):
<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" protocol="dubbo,rest" rejectedExecutionHandler="rejectedPolicy" />
<bean id="rejectedPolicy" class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy" />
示例说明
- 修改队列长度
对于一个常见的场景,多个客户端请求一个dubbo服务,如果队列长度过短,会出现RejectedExecutionException
异常。
在此情况下,可以通过调整dubbo线程池队列长度,如下所示:
<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" queues="200" />
通过上面的配置,队列长度被设置为200。
- 修改线程池类型
在另一个场景中,限制请求流程依赖请求处理能力,为了更高的并发能力和更好的用户体验,可以选择ThreadPoolExecutor类型的线程池。
增加线程池和限制策略的代码如下:
<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" protocol="dubbo,rest" rejectedExecutionHandler="rejectedPolicy" />
<bean id="rejectedPolicy" class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy" />
在上述代码中,我们将线程池类型设置为fixed
,并通过java.util.concurrent.ThreadPoolExecutor$AbortPolicy
设置线程池的拒绝策略。
这样,当线程池的线程数量和等待队列都已满时,就不会再接收新的请求,而是以抛出异常的方式拒绝请求,保证了系统的稳定性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:阿里dubbo出错提示Thread pool is EXHAUSTED问题及解决方法 - Python技术站