`

dubbo源代码-线程池分析

阅读更多
dubbo默认提供了三种线程池,分别是
fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。
cached 缓存线程池,空闲一分钟自动删除,需要时重建。
limited 可伸缩线程池,但池中的线程数只会增长不会收缩。(为避免收缩时突然来了大流量引起的性能问题)。

fixed:
public class FixedThreadPool implements ThreadPool {

    public Executor getExecutor(URL url) {
        String name = url.getParameter(Constants.THREAD_NAME_KEY, Constants.DEFAULT_THREAD_NAME);//Dubbo
        int threads = url.getParameter(Constants.THREADS_KEY, Constants.DEFAULT_THREADS);//200
        int queues = url.getParameter(Constants.QUEUES_KEY, Constants.DEFAULT_QUEUES);//0
        return new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS,
                queues == 0 ? new SynchronousQueue<Runnable>() :
                    (queues < 0 ? new LinkedBlockingQueue<Runnable>()
                            : new LinkedBlockingQueue<Runnable>(queues)),
                new NamedThreadFactory(name, true), new AbortPolicyWithReport(name, url));
    }
}

cached:
public class CachedThreadPool implements ThreadPool {

    public Executor getExecutor(URL url) {
        String name = url.getParameter(Constants.THREAD_NAME_KEY, Constants.DEFAULT_THREAD_NAME);//Dubbo
        int cores = url.getParameter(Constants.CORE_THREADS_KEY, Constants.DEFAULT_CORE_THREADS);//0
        int threads = url.getParameter(Constants.THREADS_KEY, Integer.MAX_VALUE);//Integer.MAX_VALUE
        int queues = url.getParameter(Constants.QUEUES_KEY, Constants.DEFAULT_QUEUES);//0
        int alive = url.getParameter(Constants.ALIVE_KEY, Constants.DEFAULT_ALIVE);//60s
        return new ThreadPoolExecutor(cores, threads, alive, TimeUnit.MILLISECONDS,
                queues == 0 ? new SynchronousQueue<Runnable>() :
                    (queues < 0 ? new LinkedBlockingQueue<Runnable>()
                            : new LinkedBlockingQueue<Runnable>(queues)),
                new NamedThreadFactory(name, true), new AbortPolicyWithReport(name, url));
    }
}

limited:
public class LimitedThreadPool implements ThreadPool {

    public Executor getExecutor(URL url) {
        String name = url.getParameter(Constants.THREAD_NAME_KEY, Constants.DEFAULT_THREAD_NAME);//Dubbo
        int cores = url.getParameter(Constants.CORE_THREADS_KEY, Constants.DEFAULT_CORE_THREADS);//0
        int threads = url.getParameter(Constants.THREADS_KEY, Constants.DEFAULT_THREADS);//200
        int queues = url.getParameter(Constants.QUEUES_KEY, Constants.DEFAULT_QUEUES);//0
        return new ThreadPoolExecutor(cores, threads, Long.MAX_VALUE, TimeUnit.MILLISECONDS,
                queues == 0 ? new SynchronousQueue<Runnable>() :
                    (queues < 0 ? new LinkedBlockingQueue<Runnable>()
                            : new LinkedBlockingQueue<Runnable>(queues)),
                new NamedThreadFactory(name, true), new AbortPolicyWithReport(name, url));
    }
}

provider端:默认是fixed
consumer端:默认是cached
默认线程大小是200
AbortPolicyWithReport:
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
    String msg = String.format("Thread pool is EXHAUSTED!" +
            " Thread Name: %s, Pool Size: %d (active: %d, core: %d, max: %d, largest: %d), Task: %d (completed: %d)," +
            " Executor status:(isShutdown:%s, isTerminated:%s, isTerminating:%s), in %s://%s:%d!" ,
            threadName, e.getPoolSize(), e.getActiveCount(), e.getCorePoolSize(), e.getMaximumPoolSize(), e.getLargestPoolSize(),
            e.getTaskCount(), e.getCompletedTaskCount(), e.isShutdown(), e.isTerminated(), e.isTerminating(),
            url.getProtocol(), url.getIp(), url.getPort());
    logger.warn(msg);
    throw new RejectedExecutionException(msg);
}

可以通过如下更改:
<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />
<dubbo:provider threads="200" threadpool="fixed"/>
在线程中的线程被耗尽时出现如下错误:


解决方式:
1.通过jstack -l pid进行分析,查看主要的锁资源争用情况,从而进行业务代码的排查
2.增大线程池的数量,默认是200
3.减小超时时间,避免业务处理时间过长,耗光所有的线程
  • 大小: 81.9 KB
分享到:
评论

相关推荐

    incubator-dubbo-ops-master

    【压缩包子文件的文件名称列表】"dubbo-ops"可能包含了Dubbo运维平台的相关源代码、配置文件、文档等资源。这些文件通常包括: 1. **源代码**:分为前端(Web界面)和后端(服务接口及实现),使用Java、JavaScript...

    Dubbo监控系统配置

    这通常需要修改Dubbo Admin的源代码,并重新打包部署。 #### 三、Dubbo监控系统的配置与使用 ##### 3.1 配置Dubbo Admin Dubbo Admin的配置主要涉及以下几个方面: 1. **服务注册中心**:Dubbo Admin需要连接到...

    dubbo-admin

    为了解决这个问题,用户选择了自行编译源代码,并且成功完成了编译和调试。"删除ROOT下所有文件解压放入" 这一步骤意味着用户可能需要清理原有的配置或旧版本文件,然后将新编译的版本解压到指定目录(通常 dubbo-...

    dubbo调用示例

    6. **src**:源代码目录,通常包含Java源文件和资源文件。服务提供者和服务消费者的业务逻辑、配置文件等都会在这里找到。 7. **.idea**:这是一个IDEA(IntelliJ IDEA)项目配置文件夹,包含了项目设置、模块信息...

    Dubbo传输层实现

    在`Dubbo-Transport`目录中,可能包含了Dubbo传输层的源代码实现,包括与Netty相关的类和接口。`Dubbo-Common`目录可能包含了一些通用工具类和组件,服务于整个Dubbo框架。而`Dubbbo-ExtensionLoader`则可能包含了...

    dubbo服务限制并发量示例

    这个压缩包文件名可能是 Dubbo 源码仓库的主分支,包含完整的 Dubbo 项目源代码。通过阅读和分析源码,开发者可以更深入地理解 Dubbo 内部的工作原理,包括并发控制、路由规则和服务降级的实现细节,这对于定制化...

    java简单分布式架构,多个数据源,线程池多线程访问

    本项目围绕“Java简单分布式架构,多个数据源,线程池多线程访问”这一主题展开,旨在通过利用Java技术栈实现一个高效的分布式系统。 首先,我们关注的是“分布式”这一概念。分布式系统是由多台计算机通过网络连接...

    跳槽涨薪精选面试题.pdf

    代码分析 - **题目一**:给出了一段关于`String`对象的代码,要求解释如何在不改变`s`引用的情况下,将输出变为“abcd”。 - **解答**:可以通过`String`类的`concat()`方法或`+`运算符来实现字符串拼接,同时...

    自用学习的项目.结合maven聚合,redis,mysql主从复制,dubbo,以及一系列该并发的前沿技术的项目.zip

    在kwan1117这个文件中,可能包含了项目的所有源代码、配置文件和文档。通过对这些文件的阅读和研究,你可以更深入地理解上述技术在实际项目中的应用,并有机会动手实践,提升自己的编程技能。 总之,这个项目是一个...

    Java案例开发集锦源代码

    Java案例开发集锦源代码是Java编程学习的重要资源,它包含了一系列实际项目或问题解决的实例,涵盖了Java语言的基础到高级应用。通过这些源代码,开发者可以深入理解Java编程的各种概念,提高自己的编程技巧和解决...

    TestDubbo:1.测试金融产品过程中发现provider有动态例程(provider)不消失,发现和修改时间有关系,具体原因需要看一下源代码; 2。用于重现问题,寻找bug的触发点

    2. **代码审查**:仔细阅读Dubbo相关源代码,特别是涉及到服务生命周期管理的部分,查找可能的bug或设计缺陷。 3. **单元测试**:编写针对问题的单元测试用例,确保修复的方案能够解决现有问题,并防止未来类似问题...

    Java demo 算法笔记

    Java提供了RMI(远程方法调用)、JMS(Java消息服务)以及近年来流行的微服务框架如Dubbo、Spring Cloud等,用于构建分布式应用。理解这些技术的基本原理和使用方式,有助于开发者构建可扩展、高可用的系统。 代码...

    project.zip

    【标题】"project.zip" 提供的项目是一个整合了多种技术的Java开发框架,主要基于Spring Boot、Dubbo以及Spring Data JPA,并且利用Druid作为数据源管理和线程池来优化性能。这个项目不仅包含了服务提供方(Provider...

    源码解读:参照管理系统的功能实现.pptx

    源码解读是软件开发中的一项重要技能,它涉及到对程序源代码的深入理解和分析,以揭示系统的功能实现和设计思路。在《源码解读的基本原理》中,我们了解到源码解读能够帮助我们理解系统的运作机制,提升编程能力,并...

    dubbotest1.rar

    在IT行业中,Spring Boot和Dubbo的整合是一个常见的微服务架构设计,而Zookeeper作为服务治理的工具,是实现这一整合的重要...通过解压这个项目,我们可以直接查看源代码,更深入地理解这些技术的集成方式和工作原理。

    基于EDAS的敏捷服务开发与架构.pdf

    2. 开发人员的快速扩张:团队扩大导致协作复杂性增加,源代码冲突和协同成本提高。 3. 系统代码量增多:代码库变得庞大,维护和升级变得困难。 4. 系统压力增大:随着用户数量和业务量的增加,系统性能和稳定性面临...

    wk240-lagou_homeword_1_1-master_java_

    标题中的“wk240-lagou_homeword_1_1-master_java_”似乎是一个项目作业或练习的标识,可能来源于某次编程课程或...解压后的"lagou_homeword_1_1"文件可能包含了源代码、配置文件和其他相关资源,供学习者研究和实践。

    java中高级面试必备技术

    - **代码复用性**: 提高代码可读性和可维护性。 #### 十四、SQL优化 **14.1 SQL优化技巧** - **索引**: 为经常查询的字段建立索引。 - **避免全表扫描**: 使用WHERE子句过滤数据。 - **使用EXPLAIN分析查询计划**...

    Sentinel控制台jar包

    - **流控策略**:包括直接限流、关联限流、线程池限流等,用于限制资源的访问速度。 - **降级策略**:当资源的性能恶化时,可以选择降级以保证系统的整体稳定。 - **系统保护规则**:当系统负载过高时,Sentinel ...

    面试篇大全.docx

    - 外部配置:支持从多种源加载配置文件,并允许使用环境变量或命令行参数覆盖它们。 2. **解释一下Spring Boot中的自动配置机制。** - 自动配置机制是Spring Boot的核心功能之一,通过分析类路径上的jar包和应用...

Global site tag (gtag.js) - Google Analytics