线程池也是Dubbo自动自适应扩展点之一,也可以自定义线程池。Dubbo中已实现的线程池扩展点有:

    

  其中框架提供的线程池都是通过创建真实的业务线程池进行操作的,目前线程池模型中有两个和Java中线程池相对应:

  1)fix:表示创建固定大小的线程池。也是Dubbo默认的使用方式,默认创建的执行线程数为200,并且是没有任何等待队列的。所以在极端的情况下可能会存在问题,比如操作大量执行时,可能存在堵塞的情况。

  2)cache:创建非固定大小的线程池,当线程不足时,会自动创建新的线程。但是使用的时候需要注意如果突然有高TPS的请求过来,方法没有及时完成,则会造成大量的线程创建,对系统的CPU和负载都是压力。执行越多反而会影响这个系统的效率。

  对于自定义线程池,如何实现呢?以fix模式的线程池为例,其缺点很明显因为线程池中的线程数据量不足导致很多业务直到出现问题才会去查看或通过客户反馈得知,无法自敏感应到。如果在创建该类模式的线程池是,通过某些收到对这个线程池进行监控,这样就可以信息及时的扩缩容机器或者告警,不是就解决这个问题了么?

  下面通过给Dubbo框架提供的以fixed为ID的FixedThreadPool示例分析:

  1、FixedThreadPool的UML图如下:

      

  2、查看ThreadPool接口:

    

  下面以FixedThreadPool为基础实现自定义的线程池扩展:

  1、线程池实现, 这里主要是基于对 FixedThreadPool 中的实现做扩展出线程监控的部分:
    

  2、SPI声明,创建文件 META-INF/dubbo/org.apache.dubbo.common.threadpool.ThreadPool
    

  3、在服务提供方项目引入该依赖
    

  4、在服务提供方项目中设置使用该线程池生成器

    

    为什么这样写呢?前面查看ThreadPool接口的时候,通过@Adaptive注解已经明确key值为threadpool。

  5、主执行程序多次发起请求,查看该线程池是否在服务端生效:

    消费端未执行前:

    

    消费端执行后:

    

  上述主程序中没有任何与WatchingThreadPool类直接或间接的调用,那么这个扩展点是如何被调用的呢?后续主题文章介绍。

Dubbo扩展点应用之四线程池的更多相关文章

  1. 理解线程池到走进dubbo源码

    引言 合理利用线程池能够带来三个好处. ​ 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. ​ 第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行. ...

  2. Dubbo学习笔记8:Dubbo的线程模型与线程池策略

    Dubbo默认的底层网络通讯使用的是Netty,服务提供方NettyServer使用两级线程池,其中 EventLoopGroup(boss) 主要用来接受客户端的链接请求,并把接受的请求分发给 Ev ...

  3. 原生线程池这么强大,Tomcat 为何还需扩展线程池?

    前言 Tomcat/Jetty 是目前比较流行的 Web 容器,两者接受请求之后都会转交给线程池处理,这样可以有效提高处理的能力与并发度.JDK 提高完整线程池实现,但是 Tomcat/Jetty 都 ...

  4. Hippo4J v1.3.1 发布,增加 Netty 监控上报、SpringCloud Hystrix 线程池监控等特性

    文章首发在公众号(龙台的技术笔记),之后同步到博客园和个人网站:xiaomage.info Hippo4J v1.3.1 正式发布,本次发布增加了 Netty 上传动态线程池监控数据.适配 Hystr ...

  5. Java线程池总结

    前一篇文章Java中实现多线程关键词整理中介绍了Java中创建多线程的各种办法,里面提到了线程池,这里对Java中的线程池做一个总结. 1. 关于ThreadPoolExecutor 为了更好地控制多 ...

  6. Java并发(六)线程池监控

    目录 一.线程池监控参数 二.线程池监控类 三.注意事项 在上一篇博文中,我们介绍了线程池的基本原理和使用方法.了解了基本概念之后,我们可以使用 Executors 类创建线程池来执行大量的任务,使用 ...

  7. 009-ThreadPoolExecutor运转机制详解,线程池使用1-newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor、newScheduledThreadPool

    一.ThreadPoolExecutor理解 为什么要用线程池: 1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务. 2.可以根据系统的承受能力,调整线程池中工作线线程的数 ...

  8. java线程池监控

    原因 最近在完善公司的基础发布平台的时候,使用到了一线程去做一些异步的事情,在开发环境和测试环境验证没有任何问题,但是在程序在生产运行一段时间后,发现没有得到自己想要的结果,为此开始了漫长的排查bug ...

  9. 用了很多年Dubbo,连Dubbo线程池监控都不知道,觉得自己很厉害?

    前言 micrometer中自带了很多其他框架的指标信息,可以很方便的通过prometheus进行采集和监控,常用的有JVM的信息,Http请求的信息,Tomcat线程的信息等. 对于一些比较活跃的框 ...

随机推荐

  1. vue2.0点击其他任何地方隐藏dom

    methods: { handleBodyClick(){ if (绿色区域出来了,要判断点击其他地方就要关闭,这样可以避免绿色区域已经关闭还在操作) { let _con = $(目标区域) if ...

  2. 如何查看mysql的用户权限

    查询语句:select * from mysql.user where user='root'\G;user是用户名 <privileges>是一个用逗号分隔的你想要赋予的MySQL用户权 ...

  3. MySQL提权之udf提权(无webshell的情况)

    0x00 介绍 本篇我们来讲无webshell时利用udf进行提权 0x01 前提 1. 必须是root权限(主要是得创建和抛弃自定义函数) 2. secure_file_priv=(未写路径) 3. ...

  4. Golang 基准测试Benchmark

    基准测试 Go语言标准库内置的 testing 测试框架提供了基准测试(benchmark)的能力,实现了对某个特定目标场景的某项性能指标进行定量的和可对比的测试. 基本规则 基准测试的代码文件必须以 ...

  5. 【刷题-LeetCode】224. Basic Calculator

    Basic Calculator Implement a basic calculator to evaluate a simple expression string. The expression ...

  6. word缺失字体问题

    问题 有时候word会确实一些公文使用的字体,所以会用微软雅黑进行自动替换.所以你看到和打印的仿宋等字体,会被替换成微软雅黑,这对于政府公文或者企业行政文档是不好的. 这里面的字体替换你可以用一些字体 ...

  7. C++11多线程之future(一)

    // ConsoleApplication5.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include<random> #in ...

  8. 异常机制(Exception)

    异常机制(Exception) 异常程序是指程序运行中出现的不期而至的各种状况,如文件找不到,网络连接失败,非法参数等. 异常发生在程序运行期间,它影响了正常的程序执行流程 检查性异常 最具代表性的检 ...

  9. springcloud 实现简单的 消费者和生产者 模式(Restfule 的风格)

    一.springcloud 实现简单的 消费者和生产者 模式(Restfule 的风格) 1.实现简单的消费者和生产者 springcloud使用的http协议进行传输数据,也就是说springclo ...

  10. rabbitMq使用guest登录不上的问题总结

    自己mac电脑上的mq在电脑关机(直接按电源键关机),在开机后,rabbitMq连不上了,报500错误. 1.在使用brew uninstall rabbitmq --force后; 2.我手动安装了 ...