前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >服务端频率控制的几种实现方式

服务端频率控制的几种实现方式

原创
作者头像
腾讯 BBTeam 团队
修改于 2018-06-01 08:36:35
修改于 2018-06-01 08:36:35
4.2K0
举报

服务端频率控制一般有以下几种常见的方式:

一、局部频率控制

对于某一个接口I,请求频率阈值T,假设请求均匀分散到N台服务器上,每台服务器上接口I的频率阈值就是T/N,这样每台机器通过检查接口I的本地请求频率就可以做频率控制。

这种方式优点是实现简单,而且由于是本地控制,效率极高,如果流量均匀的话,频率控制也会比较实时。对于服务器配置,地理位置,路由权重一样,这种方式可以有一些使用场景。当然缺点也很明显,就是局限性比较大,没法做全局的控制,很多场景下并不能保证每台机器流量一样,另外一旦集群发生扩容/缩容,每台机器分配到的频率阈值需要额外的重新计算。

二、全局频率控制

这种方式一般会有分布式的请求频率上报,然后有一个中心化的频率控制服务汇总请求频率信息检查是否超频,在实现上又有很多种。

简易实现

基于一些Nosql系统支持的原子计数器功能,比如可以使用CKV,Redis等提供的INCR/DECR接口,汇总来自各台服务器上报的请求频率。这种方式实现上也可以有多种。

可以利用expire机制,设置每个业务key的过期时间为频率控制周期。以1分钟频率控制周期为例,伪代码如下:

代码语言:c++
AI代码解释
复制
time_unit = 60
value = INCR $key
if key not exist
    init_value = 0
    INIT $key $init_value
    EXPIRE $key $time_unit
else
    if $value < $threshold
        // 没有超频,放行
   else
       // 超频了,限制 

也可以自己控制过期时间,原子计数器的value一般是64位整数,可以拆成两部分,高32位为时间部分,后32位为实际频率计数(当然这里不一定是以32位拆分,比如限制每天最大调用量,可能时间部分只需要16位,留下更多位给计数用)。以1分钟频率控制周期为例,伪代码如下:

代码语言:c++
AI代码解释
复制
time_unit = 60
value = INCR $key
current_minute = current_timestamp() / $time_unit * $time_unit
if key not exist
    init_value = $current_minute << 32
    INIT $key $init_value
else 
    freq_minute = $value >> 32
    freq = $value & 0xFFFFFFFF
    if $current_minute != $freq_minute
        // 不是当前频率周期了,重新初始化
        init_value = $current_minute << 32
        INIT $key $init_value
    else
        if $freq < $threshold
           // 没有超频,放行
        else
          // 超频了,限制

这两种实现方式原理都差不多,能比较实时地监测到超频的情况。前一种可以设置的频率阈值范围更大,不过对nosql系统的过期机制依赖比较严重,个人相对偏好后一种方式。不过由于都需要依赖外部存储且需要经过网络,如果网络抖动以及外部存储发生故障,频率控制可能就会失效,另外由于这类方式是把业务的请求量会直接放给外部存储,对存储的性能要求也会比较高。

复杂实现

前面的几种情况都是比较简易的实现方式,可以应对大多数简单的频率控制场景。但是对于提供API接口的门户系统,前面的功能是远远不够的,所以一般都会实现一套频率控制服务,除了限频,还有结合告警,请求频率流水等形成一套完整的频控生态。

这类系统一般会在每台业务机器上部署一个agent,业务进程写入频率信息到共享内存,agent从共享内存收集再上报,后端有一个频率服务server汇总,执行频率控制策略,下发是否超频以及频率告警等。典型的架构流程如下:

这种频控方式是比较通用的一种实现,频率上报和频率检测通过共享内存解耦了,不会像原子计数器会受制于业务的请求量,频率检测也不需要经过网络,业务进程直接从本地共享内存中就能判断是否超频了,比前面基于原子计数的快。不过受制于agent的上报的实时性,决策是否超频可能会相对延迟一些。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
性能百万/s:腾讯轻量级全局流控方案详解
WeTest质量开放平台团队
2017/07/19
2.7K0
性能百万/s:腾讯轻量级全局流控方案详解
基于redis实现分布式服务限流器
在后台开发中,服务端的限流器是一个很常见并且十分有用的组件,利用好限流器可以限制请求速率,保护后台服务。 比较常见的限流器分为两种,漏桶算法和令牌桶算法。
用户5326575
2022/06/28
1.9K0
基于redis实现分布式服务限流器
分布式环境下限流方案的实现redis RateLimiter Guava,Token Bucket, Leaky Bucket
对于web应用的限流,光看标题,似乎过于抽象,难以理解,那我们还是以具体的某一个应用场景来引入这个话题吧。在日常生活中,我们肯定收到过不少不少这样的短信,“双11约吗?,千款….”,“您有幸获得唱读卡,赶快戳链接…”。这种类型的短信是属于推广性质的短信。为什么我要说这个呢?听我慢慢道来。一般而言,对于推广营销类短信,它们针对某一群体(譬如注册会员)进行定点推送,有时这个群体的成员量比较大,甚至可以达到千万级别。因此相应的,发送推广短信的量也会增大。然而,要完成这些短信发送,我们是需要调用服务商的接口来完成的。倘若一次发送的量在200万条,而我们的服务商接口每秒能处理的短信发送量有限,只能达到200条每秒。那么这个时候就会产生问题了,我们如何能控制好程序发送短信时的速度昵?于是限流这个功能就得加上了
用户6182664
2020/05/11
6K0
4.10 51单片机-使用计数器测量NE555脉冲频率
STC90C51RC/RD+系列单片机内部设置的两个16位定时器/计数器T0和T1都具有计数方式和定时方式两种工作方式。对每个定时器/计数器(T0和T1),在特殊功能寄存器TMOD中都有一控制-C/T来选择T0或者T1为定时器还是计数器。定时器/计数器的核心部件是一个加法计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟或者每6个时钟得到一个计数脉冲,计数值加1;如果计数脉冲来自单片机外部引脚(T0为P3.3,T1为P3.3),则为计数方式,每来一个脉冲加1。
DS小龙哥
2022/01/10
1.8K0
4.10 51单片机-使用计数器测量NE555脉冲频率
检测NE555脉冲发生器产生的频率
在许多工业应用、机械控制以及实验设备中,准确测量和监控信号的频率或转速是确保系统正常运行、提高生产效率以及实现精确控制的关键。频率作为信号的基本参数之一,直接反映了信号的变化速率,而转速则通常通过测量旋转物体的频率来间接获得。
DS小龙哥
2025/05/27
1120
检测NE555脉冲发生器产生的频率
常见限流算法以及限流在单机分布式场景下的思考
今天来说说限流的相关内容,包括常见的限流算法、单机限流场景、分布式限流场景以及一些常见限流组件。
程序员小猿
2021/01/19
1.4K0
常见限流算法以及限流在单机分布式场景下的思考
5种限流算法,7种限流方式,挡住突发流量?
最近几年,随着微服务的流行,服务和服务之间的依赖越来越强,调用关系越来越复杂,服务和服务之间的稳定性越来越重要。在遇到突发的请求量激增,恶意的用户访问,亦或请求频率过高给下游服务带来较大压力时,我们常常需要通过缓存、限流、熔断降级、负载均衡等多种方式保证服务的稳定性。其中限流是不可或缺的一环,这篇文章介绍限流相关知识。
未读代码
2022/03/22
1.1K0
5种限流算法,7种限流方式,挡住突发流量?
天天P图 - 分布式频控系统的设计和优化
相信之前刷屏的“八一军装照”和“小学生证件照”大家都不陌生。类似这样的运营活动突然涌入的巨大流量对天天P图后台造成的冲击不可小觑。
天天P图攻城狮
2018/05/28
2.7K6
亿级流量架构之服务限流思路与方法
为什么要限流 日常生活中,有哪些需要限流的地方? 像我旁边有一个国家AAAA景区,平时可能根本没什么人前往,但是一到五一或者春节就人满为患,这时候景区管理人员就会实行一系列的政策来限制进入人流量, 为
周辰晨
2021/08/09
6760
基于STM32F4单片机对步进电机的控制(有代码)「建议收藏」
步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件,又称为脉冲电机。在驱动电源的作用下,步进电机受到脉冲的控制,其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比。步进电机每接收一个电脉冲,转子就转过一个相应的角度(步距角)。**改变通电顺序可改变步进电动机的旋转方向;改变通电频率可改变步进电动机的转速。**因此,通过控制输入电脉冲的数目、频率及电动机绕组的通电顺序就可以获得所需要的转角、转速及转向,利用单片机就可以很容易实现步进电机的开环数字控制。 传统的步进电机控制方法是由触发器产生控制脉冲来进行控制的,但此种控制方法工作方式单一而且难于实现人机交互,当步进电机的参数发生变化时,需要重新进行控制器的设计。因此适合于单片机控制,单片机通过向步进电机驱动电路发送控制信号就能实现对步进电机的控制。
全栈程序员站长
2022/08/23
9.4K2
基于STM32F4单片机对步进电机的控制(有代码)「建议收藏」
微服务-高并发下接口如何做到优雅的限流
通俗的来讲,一根管子往池塘注水,池塘底部有一个口子往外出水,当注水的速度过快时,池塘的水会溢出,此时,我们的做法换根小管子注水或者把注水管子的口堵住一半,这就是限流,限流的目的就是为了防止池塘的水溢出,放在软件开发中,一台硬件的CPU和内存总归是有限的,能处理的请求量是有一个阈值的,就跟人的精力一样是有限的,超过这个限度系统就会异常,人就会生病。
阿伟
2020/03/26
1.2K0
如何用Redis实现限流?
限流是指在各种应用场景中,通过技术和策略手段对数据流量、请求频率或资源消耗进行有计划的限制,以避免系统负载过高、性能下降甚至崩溃的情况发生。限流的目标在于维护系统的稳定性和可用性,并确保服务质量。
用户11397231
2024/12/10
2000
如何用Redis实现限流?
讲分布式唯一id,这篇文章很实在
分布式系统全局唯一的 id 是所有系统都会遇到的场景,往往会被用在搜索,存储方面,用于作为唯一的标识或者排序,比如全局唯一的订单号,优惠券的券码等,如果出现两个相同的订单号,对于用户无疑将是一个巨大的bug。
秦怀杂货店
2021/11/09
5490
接口中的几种限流实现
这些情况都是无法预知的,不知道什么时候会有10倍甚至20倍的流量进来,如果遇到此类情况,扩容是根本来不及的,弹性扩容也是来不及的;
动力节点Java培训
2018/12/21
1.3K0
[1228]Python prometheus-client使用方式
github:https://github.com/prometheus/client_python
周小董
2023/10/10
4.2K0
[1228]Python prometheus-client使用方式
SpringBoot限制接口访问频率 - 这些错误千万不能犯
有人设计了一个在每分钟内只允许访问1000次的限流方案,如下图01:00s-02:00s之间只允许访问1000次,这种设计最大的问题在于,请求可能在01:59s-02:00s之间被请求1000次,02:00s-02:01s之间被请求了1000次,这种情况下01:59s-02:01s间隔0.02s之间被请求2000次,很显然这种设计是错误的。
码老思
2023/10/19
1.2K0
SpringBoot限制接口访问频率 - 这些错误千万不能犯
基于分布式系统的7种唯一ID实现方案,值得收藏
系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结。生成ID的方法有很多,适应不同的场景、需求以及性能要求。所以有些比较复杂的系统会有多个ID生成的策略。
lyb-geek
2019/11/20
1.6K0
基于分布式系统的7种唯一ID实现方案,值得收藏
折腾基本功:Redis 从入门到 Docker 部署
前面写过了两篇 “Redis” 相关的内容,今天补一篇“基本功”内容,让后续折腾系列文章可以篇幅更短、内容更专注。
soulteary
2024/12/01
1830
折腾基本功:Redis 从入门到 Docker 部署
技术总结|十分钟了解分布式系统中生成唯一ID
分布式系统中生成唯一ID在后台开发是经常遇到的架构设计,当然方案有很多,比如通过redis或者数据库实现自增。 但是如果依赖redis或者数据库,会导致单点问题,在架构上反而需要考虑点更多,那怎么解决呢?
用户1904552
2025/02/27
1820
技术总结|十分钟了解分布式系统中生成唯一ID
我司“双11”限流方案,进来抄作业!
日常生活中,有哪些需要限流的地方?像我旁边有一个国家景区,平时可能根本没什么人前往,但是一到十一或者春节就人满为患,这时候景区管理人员就会实行一系列的政策来限制进入人流量,为什么要限流呢?
java进阶架构师
2021/11/17
4730
推荐阅读
相关推荐
性能百万/s:腾讯轻量级全局流控方案详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档