【弹力设计篇】聊聊限流设计

为什么需要限流

对于一个后端系统来说,其处理能力是有限的,会受到业务流程,系统配置等的限制,QPS和TPS有一个上限值,比如一个订单系统1分钟可以处理100个请求。当1分钟超过100个请求的时候,我们为了保证系统的可用性,就会采用限流设计,保证系统不会在过载的情况下,导致系统整体不可用。

实际应用场景中,比如北京的一些旅游经典会有预约模式,高铁购票也会排队进行买票。虽然可能导致后边用户买不到票,但是对于整个系统来说,可以正常处理可承载的容量。

软件设计中,数据库连接池,并发线程池等都有这样的设计。

限流策略

在这里插入图片描述
限流可以从整个链路上进行限制,比如从网关层以及服务端限流。这样像一个漏斗一样可以将较少的流量打到后端服务上。

限流的目的通过并发访问进行限制速率,一旦达到一定的速率就限制。

  • 拒绝服务,直接将超过的请求进行丢弃,可以统计哪些客户端来的请求多,直接拒绝这个客户端,防止有恶意的高并发访问。
  • 服务降级,关闭不重要的服务,将资源腾出来处理更多的用户请求,或者书数据层面返回部分数据等。预设缓存,可以通过降低数据一致性来提升性能。
  • 特权请求,对于一些电商,或者是有VIP账号的业务系统来说,可以有限处理VIP的请求。但是一般都是多租户系统才会考虑。
  • 延时处理,其实更多常见的是这种,就是将数据写入到异步消息队列中,然后下游系统按照自己的速率进行处理,对于大多数系统来说用户请求是比较宝贵的。但是这种一般也针对的是短暂的高峰请求
  • 弹性伸缩,基础架构比较完善的系统可以自动化扩容机器,比如TOP3机器比较繁忙会自动进行伸缩,扩容机器部署服务。对于中小公司来说,大多数一个服务能搭建成集群就不错了。因为需要好的运维系统,自动化发布、部署和服务注册。

限流的实现方式

计数器方式

计数器方式比较简单,就是在一定的时间间隔内通过一个全局计数器,计算每个API接口调用次数。比如1分钟超过200个请求,则直接将后续请求丢弃。每1分钟counter就恢复为0.
缺点就是无法保证限流速率,如果突然某几S 进来300个请求,就会直接被击垮。

队列算法

一种比较常见的就是排队,也就是队列算法。
请求速率可以是波动的,但是处理的速度是非常匀速的,FIFO
在这里插入图片描述
比较简单,就是只要队列不满,就写入消息到Queue,然后下游系统处理。

优先队列
可以在上述基础上进行衍生,增加一个优先级队列。
在这里插入图片描述
优先级队列的优点是可以处理权重比较高的请求,但是可能会导致低优先级队列一直得不到处理,被饿死。

权重队列
在这里插入图片描述
权重队列 比较简单,按照一定权重处理 比如3:2:1 轮询处理,先处理权重3 3个请求,然后处理权重2 2个请求,接着就是权重1 1个请求。

队列流控是以队列方式处理请求,如果下游系统处理过慢,就会导致队列满,从而触发限流。

队列长度很难去衡量应该设置什么长度,过长可能导致队列还没满,服务服务已经挂掉。所以一般采用pull模式 而不是push。这样下游系统可以根据自己的消费速度进行处理。

漏斗算法 leaky Bucket

在这里插入图片描述
漏斗算法顾名思义就是一个漏斗一样,以恒定的速率进行请求和处理。当流量过大时就会积水,水太多就会溢出。

一般采用的是队列实现,请求过多时就积压请求,队列满就开始拒绝请求。TCP中就使用 sync backlog队列来缓冲请求。

在这里插入图片描述
那么和上述的队列算法比较 就是加了一个限流器。

令牌桶算法 Token Bucket

令牌桶算法 主要是假如一个中间人,会以一定的速率放入一些token, 处理程序需要先获取到token后才可以请求,否则没有就不处理。
在这里插入图片描述
可以看到,对比漏斗算法来说是以恒定的速率进行处理请求,而令牌桶则是流量小的时候攒钱,流量大的时候可以快速处理。

Processor因为有队列的存在,所以总能以最大处理能力来处理请求。
令牌桶可以做成一个公共服务,这样在分布式系统中就可以做全局的流控。

基于响应时间的动态限流

上述算法其实依赖一个系统最大的峰值,而这个值需要在生产系统进行性能测试,性能测试非常不容易,因为对于不同的用户可能Feed流,数据库,API性能等很难给出一个恒定值。所以就衍生除动态限流的方式,设计典范就是TCP协议的拥塞控制,实时计算系统性能,设定滑动窗口的大小。

我们可以计算10S内 P90或P99的响应时间。然后超过这个阈值就自动限流。
但是需要计算所有请求比较耗费内存和CPU,可以采用蓄水池算法,另一种就是采样计算。

限流的设计要点

限流的目的主要 保证系统的SLA,防止在多租户情况下系统的整体不可用。应对突发的流量。节约成本,不会为了一个不常见的尖峰扩容系统,而是在有限的资源下承受比较高的流量。
设计上

  • 限流需要在架构设计初期就考虑好。
  • 限流模块需要好的性能
  • 限流应该有手动操作的开关。
  • 限流发生 需要通过告警提示相关人员。
  • 限流被拒绝的用户应该返回一个特定的错误码,可以和错误区分开来。走重试机制。

在这里插入图片描述

小结

本篇主要介绍了为什么需要限流设计,以及限流设计的常见 一般主要是为了保证系统的可用性,拒绝一部分用户。接着介绍了限流相关算法,计数器、排队、漏斗、令牌桶算法、动态限流算法等,然后说了下限流设计的要点。

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

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

相关文章

5.python设计模式【单例模式】

内容:保证一个类只有一个实例,并提供一个访问它的全局访问点角色: 单例(Singleton) UML图 举个例子: 需求:一个类只能实例化一个对象,不能实例化多个对象 from abc import abstract…

QT【day2】

完善登录框&#xff1a; //main头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QDebug> //信息调试类&#xff0c;用于打印输出 #include<QIcon> //图标头文件 #include<QPushButton> //按钮类头文件 #include…

细说小程序底部标签---【浅入深出系列006】

浅入深出系列总目录在000集 如何0元学微信小程序–【浅入深出系列000】 文章目录 本系列校训学习资源的选择 学习语法的前提底部标签的总概鹅厂的自定义标签官方说明&#xff1a; 先来了解app.json文件tabBar 位于app.json哪里 使用流程要注意的是&#xff1a;配套资源作业&a…

fpga开发——蜂鸣器

蜂鸣器的原理 有源蜂鸣器和无源蜂鸣器 无源蜂鸣器利用电磁感应现象&#xff0c;为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声&#xff0c;接入直流电只能持续推动振膜而无法产生声音&#xff0c;只能在接通或断开时产生声音。无源蜂鸣器的工作原理与扬声…

git实战

git实战 第一章 快速入门 1.1 什么是git git是一个分布式的版本控制软件。 软件&#xff0c;类似于QQ、office、dota等安装到电脑上才能使用的工具。版本控制&#xff0c;类似于毕业论文、写文案、视频剪辑等&#xff0c;需要反复修改和保留原历史数据。分布式 - 文件夹拷贝…

linux网卡命名规则与修改方法

一.前言&#xff1a; 在早期的的操作系统中例如fedora13或者ubuntu15之前网卡命名的方式为eth0&#xff0c;eth1&#xff0c;eth2&#xff0c;属于biosdevname 命名规范。当然这是针对intel网卡的命名规则&#xff0c;对于realtek类型的网卡会命名为ens33。但是这个编号往往不一…

(七)「消息队列」之 RabbitMQ 发布者确认(使用 .NET 客户端)

发布者确认&#xff08;Publisher Confirms&#xff09; 发布者确认是一个 RabbitMQ 扩展&#xff0c;用于实现可靠的发布。当在通道上启用发布者确认时&#xff0c;客户端发布的消息将由代理异步确认&#xff0c;这意味着它们已在服务器端得到处理。 0、引言 先决条件 本教程…

uni-app个人中心

一. 介绍uni-app&#xff1a; uni-app 是基于Vue.js框架开发的一个跨平台移动应用开发框架&#xff0c;可以同时支持多个平台&#xff08;如iOS、Android、Web等&#xff09;的应用开发。采用了统一的语法和组件规范&#xff0c;可以大大简化跨平台开发的工作&#xff0c;提高…

SZ:zip/内部函数外部函数/VGG模型/nn

zip&#xff1a; -r recursion-d delete-m move (move隐藏的意思是&#xff0c;原文件会消失&#xff09;想增加文件&#xff0c;不需要加参数什么参数也没有。如果zip压缩文件不存在&#xff0c;执行以上命令将会创建一个新的zip文件并将指定的文件添加进去。如果zip压缩文件…

需求管理中最易忽视的6大重点

需求管理是产品经理的重点工作&#xff0c;如果无法有效进行需求管理&#xff0c;往往会引起需求变更、项目延期以及成本增加等问题。那么如何对需求进行高效管理&#xff0c;我们在需求管理中&#xff0c;往往最容易忽视的重点都有哪些&#xff1f; 1、重视项目整体管理计划 首…

【前后端数据交互】原生JS的Fetch请求封装

一、 AJAX 和 Fetch 对比 1.1 AJAX 概述 AJAX 是最早出现请求数据的方式&#xff0c;它不需要不需要刷新整个页面即可更新部分数据。 属于原生 JS 范畴 &#xff0c;技术核心是 XMLHttpRequest 对象。 AJAX 请求过程&#xff1a;创建 XMLHttpRequest 对象、连接服务器、发送请…

Qt Core学习日记——第六天QMetaMethod

Qt子类会将每一个函数封装成QMetaMethod存储在对应的QMetaObject中&#xff0c;包括信号、槽函数、普通函数、构造函数、析构函数 函数解析 QMetaMethod::methodSignature 获取方法的签名 比如函数slot2&#xff0c;对应签名是“slot2(int*)” QMetaMethod::name 方法名称。…

你能说说“淘宝购物车”怎么测试么?

前言 今天我给大家整理一篇面试高频问到的问题“淘宝购物车”怎么测试。 测试思维 依然附上测试任何事物的测试思路&#xff1a; 第一步&#xff1a;梳理产品的核心业务流程&#xff1a;明白这是个什么项目&#xff0c;实现了什么业务&#xff0c;以及是怎么实现的&#xf…

从Vue层面 - 解析发布订阅模式和观察者模式区别

目录 前言一、发布订阅模式什么是发布订阅模式&#xff1f;应用场景 二、观察者模式1&#xff09;什么是观察者模式&#xff1f;2&#xff09;应用场景3&#xff09;vue中的观察者模式观察者&#xff08;订阅者&#xff09; - Watcher目标者&#xff08;发布者&#xff09; - D…

STM32 串口实验(学习一)

本章将实现如下功能&#xff1a;STM32通过串口和上位机对话&#xff0c;STM32在收到上位机发过来的字符串后&#xff0c;原原本本返回给上位机。 STM32 串口简介 串口作为MCU的重要外部接口&#xff0c;同时也是软件开发重要的调试手段&#xff0c;其重要性不言而喻。现在基本…

Fiddler使用说明及中文绿化版

Fiddler是最常用的Web调试工具之一。 对于开发来说&#xff0c;前端可以通过fiddler代理来调试JS、CSS、HTML样式。后端可以通过fiddler查看请求和相应&#xff0c;定位问题。 对于测试来说&#xff0c;可以通过抓包方式修改前端请求参数和模拟后端返回&#xff0c;快速定位缺…

如何创建vue2,vue3项目

前提需安装node.js和Vue CLI node.js:https://nodejs.org/zh-cn Vue CLI&#xff1a; npm install -g vue/cli 如何创建一个vue2项目 &#xff08;1&#xff09; 使用cmd终端直接创建 进入到vue项目所创建的目录里&#xff08;我是直接创建在桌面上&#xff09; 选择vue2 …

STL中的string类的模拟实现【C++】

文章目录 默认成员函数构造函数拷贝构造函数 赋值运算符重载函数析构函数beginendsizecapacityreserveeraseresizepush_backappendoperatorinsertswapsubstrc_stroperator[ ]findcleargetline>>运算符的重载<<运算符的重载 默认成员函数 构造函数 构造函数设置为…

现代控制理论

B站学习视频https://space.bilibili.com/230105574/channel/seriesdetail?sid1569601 一.引入状态-空间表达 &#xff08;本质上是使用一组向量的线性组合来表示整个系统任意物理量&#xff0c;也就是一个特征分解的过程&#xff09; 现代控制理论的基础是 状态-空间表达方…

IDEA以服务列表的形式展示

IDEA以服务列表的形式展示 要是没有要显示的服务列表的话就右键将启动的全部添加进去。正常是懒加载的形式&#xff0c;正常启动了就会添加进去。