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

news2024/11/26 17:26:51

为什么需要限流

对于一个后端系统来说,其处理能力是有限的,会受到业务流程,系统配置等的限制,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,防止在多租户情况下系统的整体不可用。应对突发的流量。节约成本,不会为了一个不常见的尖峰扩容系统,而是在有限的资源下承受比较高的流量。
设计上

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

在这里插入图片描述

小结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

13.2.2 【Linux】使用者功能

不论是 useradd/usermod/userdel ,那都是系统管理员所能够使用的指令, 如果我是一般身份使用者,那么我是否除了密码之外,就无法更改其他的数据呢? 当然不是啦!这里我们介绍几个一般身份使用者常用的帐号数据…

Jmeter基础篇(17)Jmeter中Stop和X的区别

一、前言 在Apache JMeter中,Stop和X之间存在一些区别。虽然它们都是用于结束测试的不同方法,但它们在实施方式和效果上存在一些差异。 二、Jmeter中的Stop 首先,让我们了解一下Stop。 在JMeter中,Stop是指在测试结束时关闭线…

Java毕业设计—爱宠医院管理系统设计与实现

爱宠医院管理系统 获取数论文、代码、答辩PPT、安装包,可以查看文章底部 一、 如何安装及配置环境 要运行整个爱宠医院管理系统需要安装数据库:MySQL 5.5,开发工具:JDK 1.8,开发语开发平台:Eclipse&…

Java开发中的分层开发和整洁架构

分层开发(横向拆分) 分层开发的概念: maven多模块开发项目管理.可以利用这种管理功能,实现一个项目的多层次模块开发–分层开发. 比如,当前项目HelloController依赖HelloService 这样做目的: 复杂开发过程.解耦(不调整依赖关系,无法解耦).分层开发(横向拆分)和纵向拆分的区别…

通过问题解决者手册推动你的结果 - 提高思维能力的 17 种方法

大部分人对产品管理的理解都是解决问题,这是他们的主要工作——找出客户的问题是什么并解决它们。但现在,热衷于解决问题的问题是,当我们看到问题时,本能反应是“我该如何解决它?” 这意味着:当我试图自己解…

26道Android 常规题,不会还不知吧?

目录 1.如何对 Android 应用进行性能分析 2.什么情况下会导致内存泄露 3.如何避免 OOM 异常 4.Android 中如何捕获未捕获的异常 5.ANR 是什么?怎样避免和解决 ANR(重要) 6.Android 线程间通信有哪几种方式 7.Devik 进程,lin…

今年这情况。。。大家还是多做一手准备吧

大家好,最近有不少小伙伴在后台留言,又得准备面试了,不知道从何下手! 不论是跳槽涨薪,还是学习提升!先给自己定一个小目标,然后再朝着目标去努力就完事儿了! 为了帮大家节约时间&a…

外观模式-提供统一入口

在办理流量套餐的时候,我们可以去官网查查询套餐,找出符合我们需求的套餐,然后进行办理。官网是充斥着各种各样的套餐,如果我们一个个去查看这些套餐,耗费的时间很多。而且在办理套餐的时候,步骤也比较多。…

提高公文写作效率,可以采用模板和样例来辅助写作

采用模板和样例是提高公文写作效率的一种常见方法。 模板是指已经制作好的公文格式和结构模板,可以根据模板来组织和排版自己的文章,以减少排版时间和排版错误。常见的模板包括各类公文格式,例如通知、报告、请示等等。在使用模板的过程中&am…

[MyBatis] Invalid bound statement (not found)解决方案

这个问题是由于mapper接口和mapper映射文件(xml)没有关联起来而导致的 出现这个问题请检查以下三处: 1、mapper接口所在包(package)的目录和xml映射文件所在的目录(directory)是否相同 特别要…

python的可迭代对象

一、介绍 在Python中,可迭代对象是指实现了__iter__()方法的对象,它可以通过调用iter()函数返回一个迭代器对象。可迭代对象可以是容器对象(如列表、元组、集合、字典等),也可以是自定义的对象。 二、实例 以下是一…

Security+备考我想分想这几点

考试初衷 本人是一名信息安全从业者,听过很多信息安全方面的认证,如CISP、CISSP、CISA,但是没听过Security认证,偶然的机会,我的同事给我介绍了谷安,从这里我才了解到还有Security认证这么一个信息安全认证…

【嵌入式Linux项目】基于Linux的全志H616开发板智能家居项目(语音控制、人脸识别)

目录 一、功能需求 二、开发环境 1、硬件: 2、软件: 3、引脚分配: 三、关键点 1、设计模式之工厂模式 2、wiringPi库下的相关硬件操作函数调用 3、语音模块的串口通信 4、线程 5、摄像头的实时监控和拍照功能 6、人脸识别 四、编…

4个特别使用做图标设计的软件,赶紧收藏

图标设计软件是设计师日常工作中经常使用到的设计软件之一,本文精选了4个好用的图标设计软件为大家推荐,一起来看看吧! 1、即时设计 即时设计是一款免费的,支持成员在线协作的图标设计软件,它提供了强大的设计功能和…

Kafka 入门到起飞 - Kafka怎么做到保障消息不会重复消费的? 消费者组是什么?

Kafka怎么做到避免消息重复消费的? 消费者组是什么? 消费者: 1、订阅Topic(主题) 2、从订阅的Topic消费(pull)消息, 3、将消费消息的offset(偏移量)保存在K…

Navicat 设置时间默认值(当前最新时间)

目录 前言1. 原理分析2. datetime和timestamp的区别3. 补充 前言 文章较短,但是体会很深!!!! 1. 原理分析 需求任务:填写数据的时候,如果时间不写,数据会默认用最新时间补充 一开…

Vue 本地应用 图片切换 v-show v-bind实践

点击切换图片的本质,其实修改的是img标签的src属性。 图片的地址有很多个,在js当中通过数组来保存多个数据,数组的取值结合索引,根据索引可以来判断是否是第一张还是最后一张。 图片的变化本质是src属性被修改了,属性…

【Python入门【推导式创建序列、字典推导式、集合推导式】(九)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白 📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 📧如果文章知识点有错误…

数学随想:轻量级算法服务。

数学随想:轻量级算法服务TOC 通常认为,数列是算法服务的基础。但是,真正用于算法服务的数列只有几个众所周知的基础数列。虽然对于不同的任务可以选择使用数列的一段用于服务,但是数列的使用还是复杂而繁重的。特别是在计算应用日…

工控机有哪些常见的硬件和软件组件?

工控机常用于制造业、自动化控制、机械设备、医疗设备、交通运输、能源管理、环境监测、安防监控等行业和领域。它们可以用于控制、监控、数据采集和处理、自动化生产线等方面。 工控机有哪些常见的硬件和软件组件? 工控机作为一种特殊的计算机设备,通…