广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Dubbo框架线程池使用介绍
  • 359
分享到

Dubbo框架线程池使用介绍

2024-04-02 19:04:59 359人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1、dubbo已有线程池2、自定义线程池1、Dubbo已有线程池 dubbo在使用时,都是通过创建真实的业务线程池进行操作的。目前已知的线程池模型有两个和java中的相互对应:

1、Dubbo已有线程池

dubbo在使用时,都是通过创建真实的业务线程池进行操作的。目前已知的线程池模型有两个和java中的相互对应:

  • fix: 表示创建固定大小的线程池。也是Dubbo默认的使用方式,默认创建的执行线程数为200,并且是没有任何等待队列的。所以在极端的情况下可能会存在问题,比如某个操作大量执行时,可能存在堵塞的情况。后面也会讲相关的处理办法。
  • cache: 创建非固定大小的线程池,当线程不足时,会自动创建新的线程。但是使用这种的时候需要注意,如果突然有高TPS的请求过来,方法没有及时完成,则会造成大量的线程创建,对系统的CPU和负载都是压力,执行越多反而会拖慢整个系统。

2、自定义线程池

在真实的使用过程中可能会因为使用fix模式的线程池,导致具体某些业务场景因为线程池中的线程数量不足而产生错误,而很多业务研发是对这些无感知的,只有当出现错误的时候才会去查看告警或者通过客户反馈出现严重的问题才去查看,结果发现是线程池满了。所以可以在创建线程池的时,通过某些手段对这个线程池进行监控,这样就可以进行及时的扩缩容机器或者告警。下面的这个程序就是这样子的,会在创建线程池后进行对其监控,并且及时作出相应处理。

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

package com.laGou.threadpool;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.threadpool.support.fixed.FixedThreadPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.concurrent.*;
public class WachingThreadPool extends FixedThreadPool implements Runnable {
    private static final Logger LOGGER = LoggerFactory.getLogger(WachingThreadPool.class);
    // 定义线程池使用的阀值
    private static final double ALARM_PERCENT = 0.90;
    private final Map<URL, ThreadPoolExecutor> THREAD_POOLS = new ConcurrentHashMap<>();
    public WachingThreadPool() {
        // 每隔3秒打印线程使用情况
        Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(this, 1, 3, TimeUnit.SECONDS);
    }
    // 通过父类创建线程池
    @Override
    public Executor getExecutor(URL url) {
        final Executor executor = super.getExecutor(url);
        if (executor instanceof ThreadPoolExecutor) {
            THREAD_POOLS.put(url, (ThreadPoolExecutor) executor);
        }
        return executor;
    }
    @Override
    public void run() {
        // 遍历线程池
        for (Map.Entry<URL, ThreadPoolExecutor> entry : THREAD_POOLS.entrySet()) {
            final URL url = entry.geTKEy();
            final ThreadPoolExecutor executor = entry.getValue();
            // 计算相关指标
            final int activeCount = executor.getActiveCount();
            final int poolSize = executor.getCorePoolSize();
            double usedPercent = activeCount / (poolSize * 1.0);
            LOGGER.info("线程池执行状态:[{}/{}:{}%]", activeCount, poolSize, usedPercent * 100);
            if (usedPercent > ALARM_PERCENT) {
                LOGGER.error("超出警戒线! host:{} 当前使用率是:{},URL:{}", url.getIp(), usedPercent * 100, url);
            }
        }
    }
}

(2)SPI声明,创建文件(固定的)

META-INF/dubbo/org.apache.dubbo.common.threadpool.ThreadPool

watching=包名.线程池名

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

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

dubbo.provider.threadpool=watching

(5)接下来需要做的就是模拟整个流程,因为该线程当前是每1秒抓一次数据,所以我们需要对该方法的提供者超过1秒的时间(比如这里用休眠Thread.sleep ),消费者则需要启动多个线程来并行执行,来模拟整个并发情况。

(6)在调用方则尝试简单通过for循环启动多个线程来执行 查看服务提供方的监控情况

package com.lagou;
import com.lagou.bean.ConsumerComponent;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import java.io.IOException;
public class AnnotationConsumerMain {
    public static void main(String[] args) throws IOException, InterruptedException {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
        context.start();
        ConsumerComponent service = context.getBean(ConsumerComponent.class);
        while (true) {
            for (int i = 0; i < 1000; i++) {
                Thread.sleep(5);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String msg = service.sayHello("world", 0);
                        System.out.println(msg);
                    }
                }).start();
            }
        }
    }
    @Configuration
    @PropertySource("classpath:/dubbo-consumer.properties")
    //@EnableDubbo(scanBasePackages = "com.lagou.bean")
    @ComponentScan("com.lagou.bean")
    @EnableDubbo
    static class ConsumerConfiguration {
    }
}

到此这篇关于Dubbo框架线程池使用介绍的文章就介绍到这了,更多相关Dubbo线程池内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Dubbo框架线程池使用介绍

本文链接: https://www.lsjlt.com/news/166653.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Dubbo框架线程池使用介绍
    目录1、Dubbo已有线程池2、自定义线程池1、Dubbo已有线程池 dubbo在使用时,都是通过创建真实的业务线程池进行操作的。目前已知的线程池模型有两个和java中的相互对应: ...
    99+
    2022-11-13
  • 【Linux网络编程】高并发服务器框架 线程池介绍+线程池封装
    目录 前言 一、线程池介绍 💻线程池基本概念 💻线程池组成部分 💻线程池工作原理  二、线程池代码封装 🌈main.cpp 🌈ThreadPool.h ...
    99+
    2023-10-20
    linux 网络 tcp/ip c++ ubuntu
  • PythonFlask框架使用介绍
    目录1. 数据库连接池2. wtfroms3. 信号3.1 内置信号3.2 使用信号3.3 自定义信号4. 多app应用5. flask-script5.1 快速使用5.2 自定制命...
    99+
    2022-11-11
  • Java shiro安全框架使用介绍
    目录1.shiro安全框架1.1 什么是权限管理1.2 什么是身份认证1.3 什么是授权1.4 认证授权框架有哪些2.使用shiro完成认证工作2.1 shiro中认证的关键对象2....
    99+
    2022-11-13
  • Micronaut框架的简单使用介绍
    目录什么是Micronaut主要特点入门依赖注入构建HTTP服务器阻塞HTTP反应式IO构建HTTP客户端声明性HTTP客户端编程HTTP客户端Micronaut客户端联合项目特征现...
    99+
    2022-11-12
  • .NET日志框架Nlog使用介绍
    目录快速安装快速配置快速使用详解配置添加支持Console输出输出至CSV文件配置日志大小配置日志分级配置生成规则日志过滤器条件语言条件函数NLog是一个基于.NET平台编写的类库,...
    99+
    2022-11-13
  • PHPYii2框架的关联模型使用介绍
    目录声明关联关系访问关联数据设置别名关联查询Active Record 可以将相关数据集中进来, 使其可以通过原始数据轻松访问。 例如,客户数据与订单数据相关 因为一个客户可能已经存...
    99+
    2022-11-13
  • 分布式框架Zookeeper api的使用介绍
    目录前言导入依赖建立会话创建节点获取节点数据修改节点数据删除节点前言 Zookeeper API共包含五个包,分别为: org.apache.zookeeperorg.apache....
    99+
    2022-11-13
  • PythonFlask框架模块安装级使用介绍
    目录一、概述二、Flask 架构三、应用模块四、路由模块五、视图模块六、模板模块七、数据库模块1)安装 SQLAlchemy2)配置数据库连接3)定义数据库模型4)数据库操作八、表单...
    99+
    2023-03-03
    Python Flask框架模块 Python Flask
  • QT线程QThread的使用介绍
    目录1. 概述2. moveThread 示例3. QThread 示例4. 总结1. 概述 QThread 有两种使用方式 QObject::moveToThread()派生QTh...
    99+
    2022-11-13
  • Scrapy框架CrawlSpiders的介绍以及使用详解
    在Scrapy基础——Spider中,我简要地说了一下Spider类。Spider基本上能做很多事情了,但是如果你想爬取知乎或者是简书全站的话,你可能需要一个更强大的武器。CrawlSpider基于Spid...
    99+
    2022-06-04
    详解 框架 Scrapy
  • SpringBoot单元测试框架Mockito介绍及使用
    目录1. 什么是mock测试2. Mockito简介3. 在SpringBoot单元测试中使用Mockito4. Mockito的限制5. 总结Mockito 是一种 Java mo...
    99+
    2023-01-04
    SpringBoot单元测试框架Mockito SpringBoot Mockito SpringBoot单元测试
  • Java 并发框架的介绍和使用方法
    这篇文章主要讲解了“ Java 并发框架的介绍和使用方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ Java 并发框架的介绍和使用方法”吧! 为什么要写这篇文章几年前 NoSQL 开始流...
    99+
    2023-06-03
  • Java并发fork/join框架的介绍及使用
    本篇内容主要讲解“Java并发fork/join框架的介绍及使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java并发fork/join框架的介绍及使用”吧!目录一、概述二、说一说 Recu...
    99+
    2023-06-20
  • Golang使用Gin框架实现HTTP上传文件过程介绍
    目录HTTP上传的文件的原理Gin框架文件上传Demo限制文件上传的大小文件类型验证文件上传进度-后台计算文件上传进度HTTP上传的文件的原理 HTTP协议的文件上传是通过HTTP ...
    99+
    2023-05-15
    Go HTTP上传文件 Go Gin框架上传文件
  • Python中线程锁的使用介绍
    目录前言方式一:使用try/finally,确保锁肯定会被释放。方式二:with语句避免使用try/finally。总结前言 当有多个线程,且它们同时访问同一资源时,需要考虑如何避免...
    99+
    2022-11-12
  • Python线程锁Lock的使用介绍
    这篇文章主要讲解了“Python线程锁Lock的使用介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python线程锁Lock的使用介绍”吧!我们知道Python的线程是封装了底层操作系统...
    99+
    2023-06-02
  • 详细介绍Golang Iris框架的安装和使用
    随着互联网的快速发展,Web开发也变得越来越重要。在现代Web开发中,一个高效、功能强大的Web框架是必不可少的。Golang Iris 就是这样一个强大的Web框架,它能够让Web开发变得更加简单、高效。本文将详细介绍Golang Iri...
    99+
    2023-05-14
  • Gin-高性能 Golang Web框架的介绍和使用
    偶遇 Gin 我之前一直在使用 Beego 框架来做应用的 Api,因为它的写法跟 PHP 的 MVC 一样,上手简单,所以对它的表现还算满意。用的久了,发现 Beego 的编程思想就是照搬了 PHP 的那一套,写法上倒没什么,但是在...
    99+
    2022-11-11
  • Java中守护线程介绍及使用
    目录一、什么是守护线程二、为什么需要守护线程三、如何使用注意:总结一、什么是守护线程 在说守护线程之前,我们先说一下什么是用户线程。 用户线程:我们平常创建的普通线程。守护线程(即 ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作