百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

动态限流下分布式调出限流设计

mhr18 2025-08-01 18:54 7 浏览 0 评论

背景

api 流控分为 in/out 两个方向,in 控制调用者调入流量, out 控制调出 api 流量。开源有比较多的限流框架,如 guava ratelimiter,sentinel 的集群流控。 ratelimiter 单机版,不适合用在分布式场景;sentinel 集群流控其实是限速,但 api 限速是动态的,我们需要调速,根据资源情况或者 api 提供者的反馈,调高,调低流限,因此自研分布式 api 流控组件。

本组件用于系统调出第三方 api 流量整型,提高 api 调用通过率

参考和术语

ratelimiter guava 流控组件

sentinel 集群流控,支持集群限流

漏桶算法:

一个固定容量的漏桶,按照常量固定速率流出水滴;

如果桶是空的,则不需流出水滴;

可以以任意速率流入水滴到漏桶;

如果流入水滴超出了桶的容量,则流入的水滴溢出了(被丢弃),而漏桶容量是不变的。

通俗的比喻,门很窄,只能通过一个人

令牌桶算法:

用户设定 QPS 为 r,则每隔 1/r 秒一个令牌被加入到桶中

设定桶中最多可以存放 b 个令牌。如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃

当流量以速率 v 进入,从桶中以速率 v 取令牌,拿到令牌的流量通过,拿不到令牌流量不通过,执行等待或熔断

通俗的比喻,门很宽,门口放一个桶,桶里放着令牌,每个人要过门需要从桶里拿个令牌,凭令牌通过,桶令牌匀速投放

场景视图

场景视图描述系统干了什么事,有什么价值

拦截器

1. 拦截 client 调用,申请 token,执行流量控制逻辑

> retrofit/okhttp3

> httpclient

> aop

2. 申请 token 返回调用频率太高(429),发送超限消息

设置 api 资源 资源是流控目标抽象,api 看作资源,资源配置流控规则

申请 token 令牌桶算法

定时重置速率作业 调度作业,依据观测速率作为经验值

事件监听 监听超限消息,调整 rate

输出测量 api 请求集群 qps ,支持 Prometheus;console(本地测试用); NopScheduledReporter(什么都不做的报告器,相当于屏蔽)

技术架构


请求,同一个资源,任何时候,任何服务,任何实例,发出请求

资源的流量限制是动态的,资源提供者根据系统总体负载的变化而变更流量限制

拦截器 调用拦截,申请令牌,若超限发送超限消息

流量控制 令牌桶算法使用 redis lua 实现

流量规则 流量规则管理

流控速率重置作业 定时重置资源流限

事件监听 接收超限事件,调速

metrics 汇集到 Prometheus,聚合统计; 作为经验值数据支持

流量控制算法

本组件使用令牌桶算法,观测作为经验值定时重置限制值; 资源调用反馈调速

详细设计

领域模型


源码

源码(付费):
https://download.csdn.net/download/szlhj/62649559

包括流控源码,及依赖 metrics-reporter,metrics 输出器

测试:TestFlowSharpingMetrics,测试包括限流和 metrics 输出,单机可用 console reporter;分布式聚合 metrics 需 Prometheus

aop: TestFlowSharpingAspect

okhttp: FlowSharpingOkHttpInterceptorTest

httpclient: FlowSharpingHttpClientTest

效果

8.1 分布式服务流控

改造 sentinel 的 okhttp 和 httpclient 两个是单元测试,但资源名称一样 r1

1)设置资源/桶
TestFlowRuleService.testAddRedsourceFlowRule

桶配置,限流 50/分钟

使用 Prometheus 输出器


上面两个图表两个不同的服务,同一机器,端口不同,下面图表两机器总的流量

绿色 pass 流量,红色 fail 流量,紫色总流量

可以看到,流量基本稳定在 50 左右

关掉一个服务,总体仍然保持 50 设定速率

再次打开另一个服务,流量速率保持设定 50

8.2 场景: 动态变更流限

8.2.1 动态变更流限通过经验速率设置, ResourceService. updateExperienceRate

"15": 80 , 15 点,经验值 80

8.2.1 经验速率设置

ResourceService. setExperienceRate

相关推荐

Java面试题及答案总结(2025版)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Redis、Linux、SpringBoot、Spring、MySQ...

Java面试题及答案最全总结(2025春招版)

大家好,我是Java面试分享最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Spring...

Java面试题及答案最全总结(2025版持续更新)

大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...

蚂蚁金服面试题(附答案)建议收藏:经典面试题解析

前言最近编程讨论群有位小伙伴去蚂蚁金服面试了,以下是面试的真题,跟大家一起来讨论怎么回答。点击上方“捡田螺的小男孩”,选择“设为星标”,干货不断满满1.用到分布式事务嘛?为什么用这种方案,有其他方案...

测试工程师面试必问的十道题目!全答上来的直接免试

最近参加运维工程师岗位的面试,笔者把自己遇到的和网友分享的一些常见的面试问答收集整理出来了,希望能对自己和对正在准备面试的同学提供一些参考。一、Mongodb熟悉吗,一般部署几台?部署过,没有深入研究...

10次面试9次被刷?吃透这500道大厂Java高频面试题后,怒斩offer

很多Java工程师的技术不错,但是一面试就头疼,10次面试9次都是被刷,过的那次还是去了家不知名的小公司。问题就在于:面试有技巧,而你不会把自己的能力表达给面试官。应届生:你该如何准备简历,面试项目和...

java高频面试题整理

【高频常见问题】1、事务的特性原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。一致性或可串性:事务的执行使得数据库从一种正确状态转换成另一种正确状态隔离性:在事务正确提交之前,不允许把该...

2025 年最全 Java 面试题,京东后端面试面经合集,答案整理

最近京东搞了个TGT计划,针对顶尖青年技术天才,直接宣布不设薪资上限。TGT计划面向范围包括2023年10月1日到2026年9月30日毕业的海内外本硕博毕业生。时间范围还...

idGenerator测评

工作中遇到需要生成随机数的需求,看了一个个人开发的基于雪花算法的工具,今天进行了一下测评(测试)。idGenerator项目地址见:https://github.com/yitter/IdGenera...

2024年开发者必备:MacBook Pro M1 Max深度体验与高效工作流

工作机器我使用的是一台16英寸的MacBookProM1Max。这台电脑的表现堪称惊人!它是我用过的最好的MacBook,短期内我不打算更换它。性能依然出色,即使在执行任务时也几乎听不到风扇的...

StackOverflow 2022 年度调查报告

一个月前,StackOverflow开启了2022年度开发者调查,历时一个半月,在6月22日,StackOverflow正式发布了2022年度开发者调查报告。本次报告StackO...

这可能是最全面的SpringDataMongoDB开发笔记

MongoDB数据库,在最近使用越来越广泛,在这里和Java的开发者一起分享一下在Java中使用Mongodb的相关笔记。希望大家喜欢。关于MongoDB查询指令,请看我的上一篇文章。SpringD...

Mac M2 本地部署ragflow

修改配置文件Dockerfile文件ARGNEED_MIRROR=1//开启国内镜像代理docker/.envREDIS_PORT=6380//本地redis端口冲突RAGFLOW_IMA...

别再傻傻分不清!localhost、127.0.0.1、本机IP,原来大有讲究!

调试接口死活连不上?部署服务队友访问不了?八成是localhost、127.0.0.1、本机IP用混了!这三个看似都指向“自己”的东西,差之毫厘谬以千里。搞不清它们,轻则调试抓狂,重则服务裸奔。loc...

我把 Mac mini 托管到机房了:一套打败云服务器的终极方案

我把我积灰的Macmini托管到机房了,有图有真相。没想到吧?一台在家吃灰的苹果电脑,帮我省了大钱!对,就是控制了自己的服务器,省了租用云服务器的钱,重要数据还全捏在自己手里,这感觉真爽。你可...

取消回复欢迎 发表评论: