技术分享 | 一文了解高并发限流算法

【知识点随笔分享 | 第九篇】常见的限流算法 当今互联网时代,随着网络流量的快速增长和系统负载的不断加重,限流算法作为一种重要的网络管理工具变得愈发重要。限流算法通过控制系统的输入和输出流量,有效地保护系统不受过载的影响,确保系统能够稳定可靠地运行。本文将介绍几种常见的限流算法及其应用场景,旨在帮助读者更好地理解限流算法的原理和实际应用,从而为网络性能优化提供有力支持。限流算法的研究和应用对于保障网络安全、提升系统稳定性具有重要意义,在当前信息化社会具有广泛的应用前景。 阅读详情

作者:杨奇龙
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


一、前言

作为热点频出的电商系统,经常遇到高并发,热点秒杀的场景。我们在开发设计高并发海量业务请求的系统时,通常利用三板斧:缓存、降级和限流来保障系统稳定性。

缓存:使业务数据更靠近数据的使用者,提升程序访问数据速度和增大系统QPS容量。

降级:当系统容量达到一定健康阈值时根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。

限流:通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统稳定可用,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。

本文聊聊限流的常用算法,并且通过案例测试验证令牌桶算法。

二、限流算法

目前程序开发过程常用的限流算法有两个:漏桶算法和令牌桶算法。

漏桶算法

漏桶算法的原理比较简单,请求进入到漏桶中,漏桶以一定的速率漏水。当请求过多时,水直接溢出。可以看出,漏桶算法可以强制限制数据的传输速度。

如图所示,把请求比作是水滴,水先滴到桶里,通过漏洞并以限定的速度出水,当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务。


图片来自网络

漏桶的出水速度是恒定的,那么意味着如果瞬时大流量的话,将有大部分请求被丢弃掉(也就是所谓的溢出)。

令牌桶算法

令牌桶算法的原理是系统以一定速率向桶中放入令牌,如果有请求时,请求会从桶中取出令牌,如果能取到令牌,则可以继续完成请求,否则等待或者拒绝服务。这种算法可以应对突发程度的请求,因此比漏桶算法好。


图片来自网络

漏桶算法和令牌桶算法的选择

两者的主要区别 漏桶算法能够强行限制处理数据的速率,不论系统是否空闲。而令牌桶算法能够在限制数据的平均处理速率的同时还允许某种程度的突发流量。

如何理解上面的含义呢?

漏桶算法 比如系统吞吐量是 120/s,业务请求 130/s,使用漏斗限流 100/s,起到限流的作用,多余的请求将产生等待或者丢弃。

对于令牌桶算法,每秒产生 100 个令牌,系统容量 200 个令牌。正常情况下,业务请求 100/s 时,请求能被正常被处理。当有突发流量过来比如 200 个请求时,因为系统容量有 200 个令牌可以同一时刻处理掉这 200 个请求。如果是漏桶算法,则只能处理 100 个请求,其他的请求等待或者被丢弃。

三、代码实现

本案例使用 python 基于令牌桶算法进行测试。

# encoding: utf-8
"""
author: yangyi@youzan.com
time: 2020/9/9 10:43 PM
func: 
"""
import time
import multiprocessing

TEST = {
    # 测试 {'test1': 20} 每秒产生的令牌数量
    'all': {
        'test1': {'test1': 20},
        'test2': {'test2': 50},
        'test3': {'test3': 80},
        'test4': {'test4': 100},#表示突发100个请求
        'test5': {'test5': 200},#表示突发200个请求
        'test6': {'test6': 20},
    }
}


class TokenBucket(object):

    # rate是令牌发放速度,capacity是桶的大小
    def __init__(self, rate, capacity):
        self._rate = rate
        self._capacity = capacity
        self._current_amount = 0
        self._last_consume_time = int(time.time())

    # token_amount是发送数据需要的令牌数
    def consume(self, token_amount):
        time.sleep(1)
        # 计算从上次发送到这次发送,新发放的令牌数量
        increment = (int(time.time()) - self._last_consume_time) * self._rate
        # 令牌数量不能超过桶的容量
        self._current_amount = min(
            increment + self._current_amount, self._capacity)
        # 如果没有足够的令牌,则不能发送数据
        if token_amount > self._current_amount:
            return False
        self._last_consume_time = int(time.time())
        self._current_amount -= token_amount
        return True


def job():
    i = 100
    while i>1:
        for result in result_dict.values():
            key = tuple(result.keys())[0]
            rate = tuple(result.values())[0]
            i = i-1
            if i <= 0:
                break

            if not limiter.consume(rate):
                print(key + ' 限流')
            else:
                print(key + ' 正常')

def run():
    threads = [multiprocessing.Process(target=job) for i in range(3)]
    for thread in threads:
        thread.start()

if __name__ == '__main__':
    result_dict = TEST["all"]
    RATE = 30
    CAPACITY = 120
    limiter = TokenBucket(RATE, CAPACITY)
    run()

这段测试代码比较简单,大家可以结合自己的业务场景在编写工具时看看哪里可以使用到限流算法。

四、参考文章

https://github.com/titan-web/rate-limit

https://www.jianshu.com/p/c6b20845561a

https://www.simpleapples.com/2018/03/20/implementation-of-the-token-bucket-algorithm-in-python/

漏桶算法(Leaky Bucket)与 令牌桶算法(Token Bucket) 漏桶算法(Leaky Bucket)与 令牌桶算法(Token Bucket)想象一个水桶,水滴(请求)不断滴入桶有一个小孔,水以固定速率流出超出桶容量的水滴(过多的请求)直接溢出,丢弃!也是一个桶,但它装的是令牌(token)令牌以固定速率生成(比如每秒100个)每个请求必须拿到令牌才能继续,否则被限流桶可以存令牌,支持短时间突发流量比较维度漏桶算法令牌桶算法出口流量恒定速率,超限丢弃灵活突发,令牌够可以爆发突发流量处理能力❌ 不允许✅ 允许短时突发实现复杂度。 阅读详情

相关推荐

令牌桶与漏桶算法深度对比分析

维度令牌桶算法漏桶算法设计理念预分配资源,允许突发平滑输出,严格限速突发处理支持,可预存令牌不支持,排队等待延迟特性低延迟,立即响应可能高延迟,需排队保护效果平均速率保护绝对速率保护适用场景用户体验优先系统稳定性优先。

ma451152002的专栏 1090

漏桶和令牌桶的区别

一、漏桶 把请求比作是水,请求进来了就把请求先放进桶里,但是不处理,并以限定的速度出水,出水就相当于处理请求。当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务 漏桶算法可以很好的控制流量的访问速度,一旦超过该速度就拒绝服务。 二、令牌桶 令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。 三、区别 漏桶:如果一下子来了很多请求,但是请求会被放在池子里面,然后以固定的速率去处理请求。 令牌桶:以固定的速率往桶

weixin_37862824的博客 1万+

从零开始:Vivado中自定义串口通信IP核的完整实现

本文详细介绍了在Vivado中从零开始实现自定义串口通信IP核的完整流程,包括Verilog核心代码编写、仿真验证、IP核封装与参数化配置技巧。通过AXI-Lite总线实现动态配置,提升FPGA开发效率,适用于各种嵌入式系统通信需求。

weixin_29274969的博客 326

限流——漏桶算法和令牌桶算法的区别

限流 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流 缓存:缓存的目的是提升系统访问速度和增大系统处理能力 降级:当服务流量剧增,影响到核心流程的性能,需要暂时屏蔽掉一些功能,待高峰过去或问题解决后再重新打开,以此释放服务器资源以保证核心任务的正常运行。 限流:限流的目的是通过对并发访问或请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、或排队或等待、降级等处理 常用的限流算法有令牌桶和,漏桶,滑动窗口 漏桶算法 漏桶(Leaky Bucket) 算

Emine 1万+

跟着Cell学单细胞转录组分析(五):单细胞转录组marker基因鉴定及细胞群注释

书接上回(跟着Cell学单细胞转录组分析(四):单细胞转录组测序UMAP降维聚类)。完成数据降维和细胞聚类后,最主要的环节和工作就是确定各个细胞群,明确是什么类型的细胞,正群的细胞定群很关键,涉及到整个研究,所以这一步宁愿多费时间,也不要出错。当然,这也不是一蹴而就的,需要反复的确认。 要确定各个群是什么细胞,首先需要了解细胞群的marker基因,因为不同类型的细胞突出 表达的基因也是不同的。这里使用FindAllMarkers鉴定各个细胞群的高表达基因。 DefaultAssay(scedata)

qq_42090739的博客 1万+

网安保研避坑指南:中科院信工所各研究室真实体验与导师选择建议

本文为中科院信工所网络安全保研生提供深度指南,详细解析了信工所六个研究室的研究方向、真实氛围与导师选择策略。文章特别强调,选择导师是决定研究生体验的关键,并提供了针对各研究室的避坑建议与实战调研方法,帮助学生做出明智选择。

weixin_29210727的博客 1583

漏桶算法和令牌桶算法

目录 1、漏桶算法 2、令牌桶算法 3、两种算法的区别 4、限流工具类RateLimiter 4.1 RateLimiter demo 4.2 主要接口 常用的限流算法有两种:漏桶算法和令牌桶算法。 1、漏桶算法 漏桶算法思路很简单,请求先进入到漏桶里,漏桶以固定的速度出水,也就是处理请求,当水加的过快,则会直接溢出,也就是拒绝请求,可以看出漏桶算法能强行限制数据的传输速率。 漏桶算法示意图 但是对于很多场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这

swadian2008的博客 1万+

别再自己写消息提示了!5分钟用WPF+Material Design打造专业级Snackbar(支持.NET 6)

本文为WPF开发者提供了一份快速集成专业级Snackbar消息提示的实战指南。通过引入MaterialDesignThemes开源库,在.NET 6 WPF项目中,仅需5分钟即可告别传统的MessageBox,实现遵循Material Design规范、动画流畅、支持队列管理的非侵入式Snackbar控件,显著提升应用的用户体验与现代化交互水平。

year5的博客 172

并发200_技术分享 | 一文了解高并发限流算法

作者:杨奇龙一、前言作为热点频出的电商系统,经常遇到高并发,热点秒杀的场景。我们在开发设计高并发海量业务请求的系统时,通常利用三板斧:缓存、降级和限流来保障系统稳定性。缓存:使业务数据更靠近数据的使用者,提升程序访问数据速度和增大系统QPS容量。降级:当系统容量达到一定健康阈值时根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。限流:通过对并...

weixin_39660922的博客 377

XDMA 驱动安装与性能测试全流程解析

本文详细解析了XDMA驱动的完整安装与性能测试流程。从环境准备、源码获取、编译安装到驱动加载与设备验证,逐步指导用户打通FPGA加速卡与主机间的高速数据通道。重点介绍了如何通过官方测试脚本进行功能验证与带宽性能测试,帮助用户评估XDMA驱动的实际传输效能,为AI推理、高频交易等低延迟高带宽应用奠定基础。

weixin_29216049的博客 524

Java接入DeepSeek大模型:从零实现流式对话+多轮会话管理(完整项目实战)

emitter.completeWithError(new RuntimeException("连接DeepSeek服务超时"));private static final Set<String> BLACK_WORDS = Set.of("暴力", "色情", "政治敏感");emitter.onCompletion(() -> log.info("SSE连接完成"));emitter.onTimeout(() -> log.warn("SSE连接超时"));// 每个路由基础连接数。

wjianwei666的专栏 928

令牌桶算法和漏桶算法有什么区别_技术分享 | 一文了解高并发限流算法

作者:杨奇龙本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。一、前言作为热点频出的电商系统,经常遇到高并发,热点秒杀的场景。我们在开发设计高并发海量业务请求的系统时,通常利用三板斧:缓存、降级和限流来保障系统稳定性。缓存:使业务数据更靠近数据的使用者,提升程序访问数据速度和增大系统QPS容量。降级:当系统容量达到一定健康阈值时根据当前业务情况及流量对...

weixin_35421203的博客 777

Oracle DG库手动注册归档日志的两种方法

有的时候由于网络或各种原因,Oracle DG库服务器上可能缺少部分归档日志文件,导致DG库的MRP进程一直处于状态。此时我们可以手动从主库或其他DG拷贝归档日志到当前DG服务器,并对日志文件进行手动注册。

Sebastien23的博客 728

一文说清楚分布式限流

本文介绍了分布式限流的需求、常用限流算法(如固定窗口、滑动窗口、漏桶、令牌桶)、业界方案(如基于Redis+Lua、分片式限流等),以及分布式限流方案的实现原理和比较。业务级限流是保护高并发系统稳定性的重要手段。常用限流算法包括固定窗口、滑动窗口、漏桶、令牌桶,它们的适用场景以及不足之处。分布式限流可基于Redis+Lua实现多种限流算法的集中式并发控制,也可采用分片式并发控制的策略。

2114

搭建ROS小车真的难吗?

搭建ROS小车真的难吗?不难 1.引言 本着为大家谋福利的心态,根据自己以往的开发经验,打算写一个从零开始制作一个可以实现地图构建和导航的ROS小车。目前某宝上面有很多现成产品,但是我个人认为,一个好的移动机器人开发工程师,应该对机器人的整个流程都能具备维护的能力,然后再深入研究其中一个方向即可。看到网上很少有整个系列的开发教程,看到同学们大多东拼西凑,浪费了不少时间。我就想着利用空余时间,将我本人的开发过程输出给大家。有基础理论、有实际工程代码、有丰富的学习资料,尽最大努力帮大家进入移动机器人的大门。 国

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

你了解哪些Java限流算法?

你了解哪些Java限流算法?

java1234的博客 930

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

技术分享: 网关限流

网关限流实战

寂夜了无痕的博客 1384

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java后端API限流秘籍:高并发的防护伞与实战指南

本指南深入探讨了Java后端API限流的必要性和实用性,结合阿里巴巴的最佳实践,旨在为高并发场景提供有效的解决方案。文中首先阐述了API限流的核心价值,随后分析了六种主流的限流算法,比如令牌桶和漏桶算法,帮助开发者选择合适的策略。进一步介绍阿里巴巴的限流实践及四大黄金定律,以保障系统的稳定性和资源的合理利用。通过限流策略组合拳和实际案例分析,分享了多种场景下的限流有效执行方案。最后,总结了技术实现方法及最佳实践,为开发者在复杂应用环境下构建高效、稳定的API限流机制提供指导。

领码SPARK - 以无代码之星火,燎原数字之未来! 1783

微服务限流及熔断一:四种限流算法(计数器算法、滑动窗口算法、令牌限流算法、漏桶限流算法)

引言 本篇内容根据《spring cloud alibaba 微服务原理与实战》中内容摘取,希望和大家分享限流的思想,本篇不涉及代码层面的实现。 限流的目的 目的:通过限制并发访问数或者限制一个时间窗口内允许处理的请求数量来保护系统 作用:损失一部分用户的可用性,为大部分用户提供未定可靠的服务 一旦达到限制数量则对当前请求处理采取对应的拒绝策略(这里其实和Java中的executor线程池远离是一样的),比如跳转到错误页面、拒接请求、进入排队系统、降级等。 限流的四种算法 1、计数器算法 计数器算法是

CTRA®王大大技术中心 2296

一分钟了解什么是限流

在开发高并发系统时,有很多手段可以保护系统,如:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统处理能力。降级是当服务出问题或影响到核心流程的性能,需要暂时屏蔽掉,待高峰过去或者问题解决后再打开。有些场景不适合用缓存或降级,比如稀缺资源(秒杀、抢购)、写服务(评论、下单)、频繁的复杂查询(评论的最后几页)等,这些场景可以用限流限制并发/请求量。

冰河的专栏 2885

高并发场景下的服务保护措施--限流机制

接口限流的方式

dsydly的博客 1087

优秀文章分享:削峰与限流:秒杀场景下的高并发写请求解决方案

削峰:削峰是指通过技术手段将瞬时的高流量分散到一段时间内,从而减小系统的峰值压力。削峰的主要目的是保护系统在高并发请求下不被压垮,确保服务的稳定性。限流:限流是指通过控制请求速率,防止瞬间爆发的流量将系统击垮。限流的主要目的是控制资源的使用,避免系统过载,确保用户请求的合理分配。

三两肉的博客 1259

Spring MVC高并发防护全攻略:限流降级+系统熔断+连接池+IO等优化策略

“当Spring MVC应用在流量洪峰中摇摇欲坠时,如何让它稳如泰山?” 本文将全面解析Spring MVC高并发场景下的系统防护体系,从基础限流到智能降级,从熔断机制到全链路防护,通过真实案例,分享构建坚不可摧的高并发防线: 🚨 核心防护策略: 6大限流算法实战对比(计数器/滑动窗口/令牌桶等) 3级降级体系设计(手动开关/自动熔断/柔性事务) 全链路防护方案(Nginx+Spring Cloud Gateway+Resilience4j) 生产级熔断配置(Hystrix/Sentinel最佳实践)

肖哥弹架构博客 2218

Kafka - Java实现Consumer消费端限流(基于令牌桶算法)

Kafka消费端限流实现(基于令牌桶算法) 摘要 本文探讨了Kafka消费端限流的重要性,并详细介绍了令牌桶算法的实现方案。主要内容包括: 消费端限流的必要性:不同于生产端限流,消费端限流主要用于保护下游系统(如数据库、API)免受过载影响,防止雪崩效应。 算法选型分析:对比了漏桶和令牌桶两种主流算法,重点推荐令牌桶算法因其支持突发流量和平滑处理的特点。 Java实现方案: 提供核心RateLimiter接口设计 实现无锁高性能的TokenBucketRateLimiter 采用CAS操作和原子变量保证线程

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
上一篇: 技术分享 | Online DDL 工具 pt-osc
下一篇: 第21问:我有个 SQL 文件要回放,又怕压死业务
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值