Dubbo源码分析----过滤器之ActiveLimitFilter

2023-11-07

ActiveLimitFilter也是用来做并发控制的,区别在于ExecuteLimitFilter作用于服务端,而ActiveLimitFilter作用于客户端。
看下官网的例子

<dubbo:service interface="com.foo.BarService" actives="10" />

即从客户端方面限制了服务最多有10个并发

接下来看下ActiveLimitFilter的invoke方法

    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        URL url = invoker.getUrl();
        String methodName = invocation.getMethodName();
        // 获取配置的数量
        int max = invoker.getUrl().getMethodParameter(methodName, Constants.ACTIVES_KEY, 0);
        // 获取当前接口调用统计
        RpcStatus count = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName());
        if (max > 0) {
            //获取接口超时时间
            long timeout = invoker.getUrl().getMethodParameter(invocation.getMethodName(), Constants.TIMEOUT_KEY, 0);
            long start = System.currentTimeMillis();
            long remain = timeout;
            int active = count.getActive();// 获取并发数
            if (active >= max) {// 如果大于最大数量
                synchronized (count) {
                    while ((active = count.getActive()) >= max) {
                        try {
                            // 挂起当前线程并释放锁,因为并发数已超过限制
                            count.wait(remain);
                        } catch (InterruptedException e) {
                        }
                        // 通过notify唤醒了,计算挂起的时间
                        long elapsed = System.currentTimeMillis() - start;
                        remain = timeout - elapsed;
                        if (remain <= 0) {// 如果已经超过超时时间
                            throw new RpcException("Waiting concurrent invoke timeout in client-side for service:  "
                                                   + invoker.getInterface().getName() + ", method: "
                                                   + invocation.getMethodName() + ", elapsed: " + elapsed
                                                   + ", timeout: " + timeout + ". concurrent invokes: " + active
                                                   + ". max concurrent invoke limit: " + max);
                        }
                    }
                }
            }
        }
        try {
            long begin = System.currentTimeMillis();
            // 增加该方法的数量
            RpcStatus.beginCount(url, methodName);
            try {
                // 调用
                Result result = invoker.invoke(invocation);
                // 减少数量
                RpcStatus.endCount(url, methodName, System.currentTimeMillis() - begin, true);
                return result;
            } catch (RuntimeException t) {
                RpcStatus.endCount(url, methodName, System.currentTimeMillis() - begin, false);
                throw t;
            }
        } finally {
            if(max>0){// 调用完成后调用notify唤醒在等待的线程
                synchronized (count) {
                    count.notify();
                } 
            }
        }
    }

整个逻辑也是比较简单的,和ExecuteLimitFilter不太一样的是,ExecuteLimitFilter在超过限制的数量后会直接返回,而ActiveLimitFilter会等待,直到超时。



作者:阿涛啊
链接:https://www.jianshu.com/p/9198a3264b85
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dubbo源码分析----过滤器之ActiveLimitFilter 的相关文章

  • 设置文本换行的限制

    我正在尝试生成一个包含四个季度的图 每个季度都有一些文字说明该季度的情况 但是 当我尝试换行文本时 我不知道如何设置文本限制 例如 在附图中 我想将文本限制为x 0 但是 它会一直持续到 x 轴限制的末尾 请查找附件中的代码以及代码生成的相
  • Android 浏览器应用程序对 URL 的最大长度有限制吗?

    有谁知道 Android 浏览器在 GET URL 中接受的字符数是否有最大限制 我假设任何限制都会转化为其他基于 WebKit 的浏览器 例如 iPhone 等 但如果有人有不同的了解 对此进行澄清也很好 None
  • MySQL 对 DELETE 语句的限制

    我针对最近遇到的错误整理了一个测试表 它涉及在尝试从 MySQL 表中删除单个记录时使用 LIMIT 我所说的错误是 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在第 1 行 LIMIT 1 附近使用的正确
  • sql fiddle 可以处理的内容有限制吗? sql fiddle 不编译任何内容并且不返回任何错误消息

    我最近创建了一个查询 该查询成功编译并返回所需的结果 当我在 stackoverflow 上的用户为我提供的另一段代码中使用该代码作为子查询时 我遇到了一些问题 但最终得到了解决 我尝试将此查询用作给我的那段代码中的子查询 但是 sql f
  • 如何限制DownloadString(url)允许的时间为500毫秒?

    我正在编写一个程序 当 textBox1 更改时 URL http example com something URL System Web HttpUtility UrlEncode textBox1 Text s new System
  • 为什么 Unicode 限制为 0x10FFFF?

    为什么最大 Unicode 代码点限制为 0x10FFFF 是否可以在该代码点之上表示 Unicode 例如0x10FFFF 0x000001 0x110000 通过任何编码方案 如 UTF 16 UTF 8 It s because of
  • C#:限制字符串的长度? [复制]

    这个问题在这里已经有答案了 我只是想知道如何限制 C 中字符串的长度 string foo 1234567890 说我们有那个 我怎样才能限制 foo 说 5 个字符 C 中的字符串是不可变的 从某种意义上说 这意味着它们是固定大小的 然而
  • 如何选择每组的前N行

    我的三重存储中有一些数据 例如 Subject Predicate Object
  • 获取Oracle子查询中order by后的第一行

    我有一个表学生 id 姓名 部门 年龄 分数 我想找到每个部门得分最高 在最年轻的学生中 的最年轻的学生 在 SQL Server 中 我可以使用以下 SQL select from student s1 where s1 id in se
  • 限制批处理脚本中生成的进程数量

    我遇到的情况与中描述的情况非常相似这个问题 https stackoverflow com questions 17236456 limiting the number of subshells spawned 但是是批量的 不是外壳 我制
  • MySQL 限制变量

    我的语法有错误 SET start 0 SELECT ROUND count item 2 FROM car INTO until SELECT FROM car LIMIT until OFFSET start 您的 SQL 语法有错误
  • 限制Socket io连接数

    是否可以限制nodejs中的套接字io连接数 我知道可以通过更改服务器 TCP 设置来配置限制 但我正在寻找一种在 nodejs 中执行此操作的方法 你可以很容易地实现它 var connectionsLimit 1 io on conne
  • FAT32 每个目录的文件数限制

    我目前正在尝试在 Xilinx Kintex 7 卡上用 C 语言编写 FAT 系统 它配备了 MicroBlaze 我已经成功创建了大部分所需的功能 我面临的问题是关于文件夹的总容量 我在网上读到 在 FAT32 中 一个文件夹应该能够包
  • 使用 SQLite 查找查询中行的差异

    我有一个SQLite包含各种产品价格的表 它是一个快照表 因此包含 5 分钟间隔的价格 我想编写一个查询 该查询将返回每件商品从一行到下一行的价格差异 这些列是 id 自动增量 record id 产品的 id 价格 该时间点的价格 时间
  • 数组中超过 640 000 个元素 - 内存问题 [Dijkstra]

    我有一个脚本将 803 803 644809 每个图表内有 1 000 000 个值 使用 500 500 一切正常 但现在它崩溃了 它尝试分配超过 64MB 的内存 我没有 解决办法是什么 以某种方式 分裂 它还是 result mysq
  • Google 应用引擎 - 限制上传文件大小

    我想根据以下要求限制文件上传期间的大小 1 客户端 除非使用Flash或Applet等客户端插件 否则这几乎是不可能的 所以我放弃了这个 2 在服务器端 我可以在将文件 图像 视频存储到数据库之前知道其大小吗 Thanks 随着斑点存储区
  • richTextBox 字符数限制?

    我在丰富的文本框中存储大量文本时遇到问题 我正在尝试读取一个相当大的文本文件 从 90mb 到 450mb 的任意位置 并将我读到的内容放入富文本框中 它可以在一个简单的程序中运行 但是当我在一个复杂的程序中运行时 我会得到一个 OutOf
  • Windows 上任何单个进程可以寻址的最大内存量

    Windows 版本的内存限制 http msdn microsoft com en us library windows desktop aa366778 28v vs 85 29 aspx回答 Windows 上任何单个进程可以寻址的最
  • Windows 中内存分配的限制+我计算得是否正确?

    我正在编写一个需要大量内存的程序 大型图形分析 目前我的程序中有两个主要的数据结构 占用了大部分内存 这些都是 n n 类型的矩阵int 和长度为 n 的数组 类型Node 在本例中 节点是一个包含两个 int 的结构体 sizeof No
  • Ubuntu 16.04 - Apache 2.4.18 - 请求 URI 太长

    我试图从 Google 图片搜索结果中保存图像 但是当我在查询字符串参数中发送图像的 src 时 会出现以下错误 Request URI Too Long The requested URL s length exceeds the cap

随机推荐

  • Burp Suite抓不到本地包/localhost包问题解决汇总

    一 火狐配置好IP和安装后BP的证书 1 首先在火狐浏览器中配置好本地IP选项 2 配置好后访问http burp 下载安装证书先点击右上角下载证书 3 下载好后双击运行 安装证书 二 尝试使用本地IP域名 我们将地址栏的localhost
  • 第四章. Pandas进阶—数据导出

    第四章 Pandas进阶 4 7 数据导出 1 导出 xlsx文件 1 语法 DataFrame to excel excel writer sheet name Sheet1 na rep float format None column
  • C#关于set()和get()方法的理解及使用

    set 与 get 意思 set是设置 get是获取 顾名思义 这两个方法是对数据进行设置和获取用的 C 面向对象编程中的封闭性和安全性 封闭性即对类中的域变量进行封闭操作 即用private来修饰他们 其他类则不能对该变量访问 这样我们就
  • PLC与旋转编码器的连接

    PLC与旋转编码器的连接 PLC与常用输入设备的连接 旋转编码器是一种光电式旋转测量装置 它将被测的角位移直接转换成数字信号 高速脉冲信号 因此可将旋转编码器的输出脉冲信号直接输入给PLC 利用PLC的高速计数器对其脉冲信号进行计数 以获得
  • Xshell4 注册码 ,Xftp4 注册码

    Xshell 4 注册码 690313 111999 999313 Xftp 4 注册码 101210 450789 147200 Xmanager注册码 101210 450789 147200 喜欢本文的朋友们 欢迎关注微信公众号 Ja
  • 一文读懂USB TypeC与USB-PD。TypeC引脚定义-24P 16P 6P,CC1、CC2的作用,USB-PD介绍,USB2.0/3.0接口类型一览

    USB TypeC USB PD USB接口类型 24P USB TypeC 引脚定义 USB TypeC 拥有诸多优点 双面可插不担心正反 可做USB 雷电高速传输载体 支持 PD快充 音频设备 HDMI传输 调试模式等诸多功能 市面上的
  • 【花雕学AI】超级提问模型大全!150个ChatGPT神奇示例,让你的聊天更有趣!

    引言 你是否想要成为聊天高手 让你的对话更加有趣和深入 你是否想要掌握一些超级提问模型 让你的聊天更加有创意和挑战 你是否想要借助人工智能的力量 生成一些适合你的超级提问模型 如果你的答案是肯定的 那么你一定不能错过这篇文章 在这里 我们将
  • 大话设计模式——适配器模式

    适配器模式 适配器模式 将一个类的接口转换成客户希望的另外一个接口 Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 系统的数据和行为都正确 但接口不符时 我们应该考虑用适配器 目的是使控制范围之外的一个原有对象与
  • fabric基本概念

    Hyperledger fabric基本概念 首先fabric是由IBM贡献的超级账本框架 它是一个利用现有成熟的技术来组合而成的一个区块链技术的实现 它是一种允许可插拔实现各种功能的的模块化架构 它具有强大的容器技术 来承载各种主流语言来
  • mysql 有外键 怎么插入数据_外键约束的表怎么插入数据

    有外键的情况应该先添加主表数据 再添加副表数据 如 有以下两张表 班级表 CLASSID NAME 1 一班 2 二班 学生表 SID NAME CLASSID 1 张三 1 2 李四 1 3 王五 2 其中学生表中的CLASSID是班级表
  • tenforflow实战谷歌深度学习框架

    图像识别与卷积神经网络 神经网络 全连接层网络结构 卷积神经网络 循环神经网络 第八章介绍 全连接层网络结构 神经网络层中的邻接层的节点都与相邻的节点相连接 卷积神经网络 和全连接层中的神经网络整体结构差不多 但是结构还是有很大的差别 卷积
  • if or函数套用_Excel If函数单条件与用嵌套或And/*、OR/+组合多个条件使用实例

    If函数是 Excel 中使用特别多的函数之一 它用于逻辑判断 Excel If函数共有三个参数 第一个为条件 二三个为返回值 如果条件为真 返回第二个参数 否则返回第三个参数 If函数可以嵌套 并且在一个If函数中最多能嵌套 64 个 I
  • 该升级了,阿里云Code升级Codeup

    如果你还在使用阿里云Code 不防看看如何从阿里云Code升级至Codeup 云效代码管理Codeup是阿里云出品的一款企业级代码管理平台 提供代码托管 代码评审 代码扫描 质量检测等功能 全方位保护企业代码资产 帮助企业实现安全 稳定 高
  • GeoServer style(sld)中文乱码解决方法

    在说明这个问题之前 有三点需要明确 一是创建New style时 网页中文本框内的内容才是最终会应用到GeoServer的sld内容 这与本地sld文件没有关系 二是xml的encoding定义的编码不一定和文件编码 文件的字符编码 一致
  • 【C++】C++知识面经;C++易错点汇总;

    文章目录 在main执行之前和之后执行的代码可能是什么 程序在执行int main int argc char argv 时的内存结构 你了解吗 C 从代码到可执行程序 预处理 编译 汇编 链接 C 特点 为什么C 没有垃圾回收机制 这点跟
  • 算法图解 总结

    定义 算法指的是解题方案的准确而完整的描述 是一系列解决问题的清晰指令 算法代表着用系统的方法描述解决问题的策略机制 也就是说 能够对一定规范的输入 在有限时间内获得所要求的输出 如果一个算法有缺陷 或不适合于某个问题 执行这个算法将不会解
  • 怎么使用chatGTP

    ChatGTP是一个开源的即时通讯工具 可以用来在网络上进行实时文本聊天 要使用ChatGTP 您需要完成以下步骤 安装ChatGTP 在网上搜索 ChatGTP 然后在官方网站上下载并安装最新版本的软件 创建帐户 打开ChatGTP 点击
  • 怎么用python编简单游戏大全_适合新手练手的三个python简单小游戏

    学Python之前我们先来几个简单的小游戏练练手 这三个小游戏一个比一个复杂 建议新手慢慢来 1 猜拳 import random 导入随机模块 num 1 yin num 0 shu num 0 while num lt 3 if shu
  • RGMII(介质独立接口) PCB布线设计

    RGMII 介质独立接口 PCB布线设计 本文主要讲解的是RGMII PCB的设计 包括特性和运用的总结 希望大家看了以后能轻松的应对各种RGMII方案的PCB设计 网络设备一定离不开MAC和PHY 有MAC和PHY的地方就有相应的接口 无
  • Dubbo源码分析----过滤器之ActiveLimitFilter

    ActiveLimitFilter也是用来做并发控制的 区别在于ExecuteLimitFilter作用于服务端 而ActiveLimitFilter作用于客户端 看下官网的例子