流量控制的艺术:深入探索分布式限流策略与实践

前言

​ 当资源成为瓶颈时,服务框架需要对消费者做限流,启动流控保护机制。流量控制有多种策略,比较常用的有:针对访问速率的静态流控、针对资源占用的动态流控、针对消费者并发连接数的连接控制和针对并行访问数的并发控制。

常见限流方式
静态流控

​ 主要针对客户端访问速率进行控制,它通常根据服务质量等级协定(SLA)中约定的QPS做全局流量控制,例如订单服务的静态流控阈值为100 QPS,则无论集群有多少个订单服务实例,它们总的处理速率之和不能超过100 QPS。

动态流控

​ 它的最终目标是为了保命,并不是对流量或者访问速度做精确控制。当系统负载压力非常大时,系统进入过负载状态,可能是CPU、内存资源已经过载,也可能是应用进程内部的资源几乎耗尽,如果继续全量处理业务,可能会导致长时间的Full GC、消息严重积压或者应用进程宕机,最终将压力转移到集群其它节点,引起级联故障。触发动态流控的因子是资源,资源又分为系统资源和应用资源两大类,根据不同的资源负载情况,动态流控又分为多个级别,每个级别流控系数都不同,也就是被拒绝掉的消息比例不同。每个级别都有相应的流控阈值,这个阈值通常支持在线动态调整。

并发控制

​ 针对线程的并发执行数进行控制,它的本质是限制对某个服务或者服务的方法过度消费,耗用过多的资源而影响其它服务的正常运行。并发控制有两种形式:针对服务提供者的全局控制和针对服务消费者的局部控制。

连接控制

​ 通常分布式服务框架服务提供者和消费者之间采用长连接私有协议,为了防止因为消费者连接数过多导致服务端负载压力过大,系统需要支持针对连接数进行流控。

分布式限流

​ 以上限流方式只能针对单机进行限流,无法根据实际需要进行流量限制,接下来介绍一下分布式限流方案。

计数服务

在这里插入图片描述

  1. 开发一个技术服务模块
  2. 配置模块进行限流额度配置
  3. 每次请求上报到 redis
  4. 进行请求计数统计
  5. 限流模块进行超额判断

​ 问题:

  1. Redis 单点问题
  2. 每次请求都要上报,多一次缓存的网络请求,对性能有影响
  3. 固定配额,不够灵活
计数服务2.0

​ 图源:极客时间- go 编程训练营

  1. 管理后台配置额度
  2. 服务端分配额度
  3. API网关请求额度
  4. API 网关基于令牌桶算法本地进行限流
  5. 本地进程异步上报令牌,服务端根据管理后台配置和算法重新分配限额
分布式限流

最大最小分配算法

  1. 初始分配默认配额
  2. 一旦有历史窗口的值可以基于历史窗口的值统计进行配额请求
  3. 如上图所示
    1. 假设起初总配额是10
    2. A请求2、B请求2.6、C请求4、D请求5配额
    3. 先进行平均分配,10/4 每人分配 2.5 个配额
    4. A只需要2个,所以分配2,多出0.5进一步分配
    5. 0.5/3 + 2.5, B、C、D 各分配2.666
    6. B 只申请了 2.6 个配额,所以多出 0.06 个配额
    7. 0.06/2 + 2.666 , C、D 分配 2.7 个配额
    8. 分配结束,每个服务都尽量做到了公平的资源最大分配

加权最大最小分配算法

  1. 有四个用户,A、B、C、D 分别申请资源 2、4、4、10
  2. 权重分别为 4、2.5、1、0.5
  3. 资源总量16
  4. 对权重进行标准化分别乘10,再化简,得到:8、5、2、1
  5. A 分得配额8、B 5、C 2、D 1
  6. 由于A 只需要资源2、B只需要资源4,因此A+B多出资源 7
  7. 多出的资源再分配给C、D, C=2+7*(2/3)、D=1+7*(1/3)
  8. 一次C获得的资源为 6.666, D获得的资源为3.333
  9. 将C多出的 6.666-4=2.222 再次分配给D
  10. 所以D获得的资源为 2.222+3.333=5.555
Reference
  1. 微服务治理的技术演进和架构实践
  2. max-min fairness 最大最小公平算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/648544.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【全开源】排队叫号系统源码(FastAdmin+GatewayWorker)

一款基于FastAdminGatewayWorker开发的多项目多场景排队叫号系统,支持大屏幕投屏,语音播报叫号,可用于餐厅排队取餐、美甲店排队取号、排队领取、排队就诊、排队办理业务等诸多场景,助你轻松应对各种排队取号叫号场景。 ​打造高…

【C语言】大小端字节序存储

引子 不知道你是否像我一样好奇过一个问题:为什么每当我们在调试查看内存窗口时,(以int类型为例)4个字节内容存储的顺序好像是倒着的。 比如下面这张图,十进制数2077转换为十六进制是0x81d,四个字节分别是…

Activiti7_使用

Activiti7_使用 一、Activiti7二、绘制工作流三、通过代码部署流程,再对流程进行实例化,完整运行一遍流程即可四、在springbooot中使用 一、Activiti7 为了实现后端的咨询流转功能,学习Activiti7,记录下使用的过程及遇到的问题 二…

【赠书第24期】Java项目开发实战(微视频版)

文章目录 前言 1 项目选择与需求分析 1.1 项目选择 1.2 需求分析 2 系统设计 2.1 系统架构设计 2.2 数据库设计 2.3 接口设计 3 编码实现 3.1 环境搭建 3.2 编码规范 3.3 编码实现 4 测试与部署 4.1 单元测试 4.2 系统测试 4.3 部署与上线 5 总结与展望 6 推…

行为神经科学研究利器 | FiPhA:光纤光度分析开源平台

摘要 意义:光纤光度法(FP)是现代行为神经科学中广泛使用的技术,利用基因编码荧光传感器监测清醒行为动物的神经活动和神经递质。然而,分析光度数据既费力又耗时。 目的:本研究提出了一种通用的FP分析应用——光纤光度分析(FiPhA…

n7. 图

1.定义 图的每个结构之间有着某种关系。 六度空间理论等; 1.1引子: 最短路径问题 1.2什么是图 表示一种多对多的关系 线性关系表示的是一对一的关系,树表示的是一对多的关系。其实线性表和树其实都可以认为是图的一种特殊的情况。包含&am…

一种改进的形态学滤波算法-以心电信号的基线校正和噪声抑制为例(MATLAB环境)

信号在釆集和传输过程中难免受到噪声源的干扰,反映非线性动力学行为的特征信息有可能被噪声所掩盖。尤其是在混沌振动信号噪声抑制方面,因为混沌信号的高度非线性及宽频特性,噪声和混沌信号往往具有重叠的带宽。传统的时域及频域降噪方法效果…

【设计模式】JAVA Design Patterns——Data Access Object(数据访问对象模式)

🔍目的 对象为某种类型的数据库或其他持久性机制提供了抽象接口。 🔍解释 真实世界例子 有一组客户数据需要持久化到数据库中。 我们需要整个额外的增删改查操作以便操作客户数据。 通俗描述 DAO是我们通过基本持久性机制提供的接口。 维基百科 在计算机…

第七届数字峰会即将举行!正宇软件助力数字赋能社会发展!

据人民日报消息,由国家发展改革委、国家数据局、国家网信办、科技部、国务院国资委、福建省人民政府共同主办,福州市人民政府和相关单位承办的“第七届数字中国建设峰会”,将于5月24日至25日在福建省福州市举行,主题是“释放数据要…

事务报错没有显示回滚导致DDL阻塞引发的问题

在业务开发过程中,显示的开启事务并且在事务处理过程中对不同的情况进行显示的COMMIT或ROLLBACK,这是一个完整数据库事务处理的闭环过程。 这种在应用开发逻辑层面去handle的事务执行的结果,既确保了事务操作的数据完整性,又遵循了…

C++:单例模型、强制类型转换

目录 特殊类的设计不能被拷贝的类实现一个类,只能在堆上实例化的对象实现一个类,只能在栈上实例化的对象不能被继承的类 单例模式饿汉模式懒汉模式饿汉模式与懒汉模式的对比饿汉优缺点懒汉优缺点懒汉模式简化版本(C11) 单例释放问…

速看!打造专属数字化能力模型的七大关键!

在数字化浪潮中,企业如何打造适应自身发展的数字化能力模型?这是许多企业面临的重要课题。今天,通过众多企业使用蚓链数字化生态解决方案实践总结,为大家分享至关重要的七大经验,助你开启数字化转型之旅! 1…

栈和队列OJ题详解

一.有效的括号: 20. 有效的括号 - 力扣(LeetCode) 首先拿到这个题目,我的第一个思路是利用双指针来走,看看是不是匹配的 但是这种情况就把双指针的这个思路直接pass了,明明是匹配的括号,用双指…

protobuf学习

学习了下protobuf这个工具,可以用来序列化数据结构,而且效率很高,数据可以压缩的更小。 记录下,我这里主要在C#里使用,从NuGet程序包安装以下两个 安装好后可以在该程序目录找到 packages\Google.Protobuf.Tools.3.26.…

【计算机毕业设计】安卓054基于Android校园助手

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

离线强化学习基础知识之offline MBRL和MFRL

1 离线强化学习介绍 离线强化学习(也称为批量强化学习或完全脱策略强化学习)仅依赖于先前收集的数据集,无需进一步交互。它提供了一种利用先前收集的数据集的方法以自动学习决策策略。 离线强化学习可以被定义为 data-driven 形式的强化学习…

一篇文章讲透排序算法之堆排序

1.前言 在学习这篇文章之前,请大家先学习堆这一数据结构中堆的概念,向下调整算法,向下调整建堆。 有关堆的实现方式请参考:堆的实现 堆排序就是利用堆里面学习过的知识点进行排序,如何进行排序呢? 2.堆…

拓扑排序(概念 + 模板 + 例题)

概念 : 拓扑排序只有有向图有 &#xff0c; 可以判断图中是否有环 ; Kahn(卡恩)算法 过程 : 模板 : vector<int> a[N] , res ; int d[N] ; // 存放每个结点的入度 int n , x ;bool toposort() {queue<int> q;for(int i 1; i < n; i) if(d[i] 0) q.push…

python中GUI之tkinter 模块

目录 1.tkinter 模块使用 tkinter 介绍 创建一个简单的 GUI 给窗口添加小构件 小构件种类 小构件参数说明 查看某个小构件的所有方法和属性 常用小构件用法 Button&#xff1a;按钮用法 Label&#xff1a;标签用法 Radiobutton&#xff1a;单选按钮用法 Checkbutto…

月薪5万是怎样谈的?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测技术社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;目前是晶圆厂的PE&#xff0c;但是想跳槽谈了几次薪水&#xff0c;都没法有大幅度的增长&#xff0c;该怎么办&#xff1f;“学得文武…