Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang 语言怎么实现访问流量限流?

Golang 语言怎么实现访问流量限流?

作者头像
frank.
发布于 2021-01-22 02:32:30
发布于 2021-01-22 02:32:30
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

01

介绍

为了保护业务系统不会在访问流量过载的情况下出现问题,我们就需要限流。常见的限流算法有:固定时间窗口限流算法,滑动时间窗口限流算法,漏桶限流算法,令牌桶限流算法。其中固定时间窗口限流算法和滑动时间窗口限流算法比较简单,感兴趣的读者可以自己去研究。

02

漏桶

所谓漏桶算法,就像一个漏斗一样,把倒入的水比作访问流量,把流出的水比作业务系统处理的请求,当访问流量过大时,漏桶就会积水,甚至水会溢出。

图片来自网络

推荐 uber 团队开源的一个 Golang 语言实现的关于漏桶限流算法的开源库。

github.com/uber-go/ratelimit

此包提供了漏桶速率限流算法的 Golang 实现。此实现根据请求之间的时间重新填充存储桶,而不是要求间隔时钟离散地填充存储桶。

创建每秒最多执行操作数的限流器。使用时间(1秒)除以设定的每秒最多执行操作数,计算出每个请求之间的时间间隔。每次操作前调用 Take() 方法。判断该请求与上一次请求之间的时间间隔是否达到每个请求之间的间隔时间,如果未达到,Take 就 sleep,直到达到间隔时间才继续执行。

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import (
 "fmt"
 "time"

 "go.uber.org/ratelimit"
)

func main() {
    rl := ratelimit.New(100) // per second

    prev := time.Now()
    for i := 0; i < 10; i++ {
        now := rl.Take()
        fmt.Println(i, now.Sub(prev))
        prev = now
    }

    // Output:
    // 0 0
    // 1 10ms
    // 2 10ms
    // 3 10ms
    // 4 10ms
    // 5 10ms
    // 6 10ms
    // 7 10ms
    // 8 10ms
    // 9 10ms
}

03

令牌桶

所谓令牌桶算法,就是预先放入桶内一些 token,在业务系统处理访问请求时,需要拿到 token 之后才可以处理,如果拿不到 token 就不处理该请求。

图片来自网络

关于令牌桶限流算法,推荐 Github 开源的一个高效的基于令牌桶限流算法实现的限流库:

github.com/juju/ratelimit

关于这个库的文档比较详细,限于篇幅,本文不再介绍使用方法,建议读者直接阅读官方文档。

04

总结

本文我们介绍了常见的几种限流算法,其中重点介绍了漏桶限流算法和令牌桶限流算法,细心的读者可能已经发现,漏桶限流算法是以一个固定的速率处理请求,令牌桶算法是以单位时间内固定处理一定数量的请求,而放入令牌的速度决定了处理请求的平均速度。但是他们也有一个共同点,就是在流量洪峰来临时,他们总是按照自己最大的处理能力来处理访问流量,漏桶是最大容量,令牌桶是最大令牌数量。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go语言开发栈 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
高并发系统下,如何用限流算法优雅地保护你的服务?
在微服务架构盛行的今天,服务间的调用链路变得越来越复杂。一个看似平静的系统,往往在瞬间的流量洪峰面前不堪一击。当双11零点、热门事件爆发、或者恶意攻击来临时,如何确保我们的服务能够稳定运行,而不是在流量面前缴械投降?
左诗右码
2025/08/26
2280
高并发系统下,如何用限流算法优雅地保护你的服务?
golang 源码分析:uber-go/ratelimit
https://github.com/uber-go/ratelimit 是一个漏桶限流器的实现,
golangLeetcode
2022/08/02
1K0
限流组件uber/ratelimit的源码分析
在分析uber/ratelimit组件的设计之前,我们需要知道这个组件的功能。ratelimit 见名思义就是用来做"频次控制"的, 是Leaky Bucket 算法的一个实现。
Johns
2021/07/16
1.9K0
限流组件uber/ratelimit的源码分析
Go每日一库之104:uber-go%2Fratelimit
限流又称为流量控制(流控),通常是指限制到达系统的并发请求数,常用的限流算法主要有漏洞和令牌桶。
luckpunk
2023/09/30
4720
Golang 限流器(3) - uber 开源限流器
main方法中调用了take方法,该方法囊括了整个uber限流器包的主要代码和主要几乎全部功能:
后端云
2023/02/10
5160
Golang 限流器(3) - uber 开源限流器
分布式系统高可用实战之限流器(Go 版本实现)
1. 问题描述2. 信号量限流2.1 阻塞方式2.2 非阻塞方式3. 限流算法3.1 漏桶算法3.2 令牌桶算法3.3 漏桶算法的实现改进4. Uber 开源实现 RateLimit 深入解析4.1 引入方式4.2 使用4.3 实现细节构造限流器限流器Take() 阻塞方法5. 小结优质图书推荐参考
aoho求索
2020/05/11
2K0
分布式系统高可用实战之限流器(Go 版本实现)
Nginx限流应用 & 漏桶/令牌桶算法原理
限流是一个后台服务的重要组成部分,尤其是在应对大量并发请求时,将流量限制到系统能够承受的范围内,才能保证系统安全高效运行。 本文从nginx配置入手,先列举限流的几种场景和nginx限流配置的用法,结合实验验证,再详细分析nginx中的漏桶算法原理。
梦飞
2022/06/23
1.4K0
Nginx限流应用 & 漏桶/令牌桶算法原理
Golang官方限流器的用法详解
限流器是提升服务稳定性的非常重要的组件,可以用来限制请求速率,保护服务,以免服务过载。限流器的实现方法有很多种,常见的限流算法有固定窗口、滑动窗口、漏桶、令牌桶,我在前面的文章 「常用限流算法的应用场景和实现原理」 中给大家讲解了这几种限流方法自身的特点和应用场景,其中令牌桶在限流的同时还可以应对一定的突发流量,与互联网应用容易因为热点事件出现突发流量高峰的特点更契合。
KevinYan
2021/07/15
6.5K0
组件分享之后端组件——基于Golang实现的漏桶式速率限制算法(并发限定模块)ratelimit
近期正在探索前端、后端、系统端各类常用组件与工具,对其一些常见的组件进行再次整理一下,形成标准化组件专题,后续该专题将包含各类语言中的一些常用组件。欢迎大家进行持续关注。
cn華少
2022/06/12
4560
微服务容错与隔离:限流保护,计数器+漏桶+令牌桶算法限流实现
限流的目的是保护系统不被大量请求冲垮,通过限制请求的速度来保护系统。在电商的秒杀活动中,限流是必不可少的一个环节。
愿天堂没有BUG
2022/10/28
3090
微服务容错与隔离:限流保护,计数器+漏桶+令牌桶算法限流实现
分布式高并发系统限流原理与实践
随着业务的发展壮大,对后端服务的压力也会越来越大,为了打造高效稳定的系统, 产生了分布式,微服务等等系统设计,因为这个原因,设计复杂度也随之增加,基于此 诞生了高并发系统三大利器限流,缓存,降级/熔断。
merlinfeng
2020/12/31
9510
分布式高并发系统限流原理与实践
go 如何给服务做限流?
【1】限流就是限制流量进入或者从系统出去的速率,防止流量过高导致系统过载或者崩溃。
Johns
2021/07/15
3.1K0
go 如何给服务做限流?
聊聊限流器TokenBucket的基本原理及实现
大家好,我渔夫子。上篇文章我们讲解了漏桶(LeakyBucket)的实现原理。本文我们介绍另外一种限流器---令牌桶(TokenBucket)。
Go学堂
2023/01/31
1.2K0
高并发系统的限流策略:漏桶和令牌桶(附源码剖析)
漏桶算法比较好理解,假设我们现在有一个水桶,我们向这个水桶里添水,虽然我们我们无法预计一次会添多少水,也无法预计水流入的速度,但是可以固定出水的速度,不论添水的速率有多大,都按照固定的速率流出,如果桶满了,溢出的上方水直接抛弃。我们把水当作HTTP请求,每次都把请求放到一个桶中,然后以固定的速率处理请求,说了这么多,不如看一个图加深理解(图片来自于网络,手残党不会画,多多包涵):
Golang梦工厂
2022/07/08
1.1K0
高并发系统的限流策略:漏桶和令牌桶(附源码剖析)
Spring Boot 的接口限流算法
在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,不处理的话甚至会造成整个应用不可用。
阿珍
2025/06/11
1600
Spring Boot 的接口限流算法
亿级流量架构之服务限流思路与方法
为什么要限流 日常生活中,有哪些需要限流的地方? 像我旁边有一个国家AAAA景区,平时可能根本没什么人前往,但是一到五一或者春节就人满为患,这时候景区管理人员就会实行一系列的政策来限制进入人流量, 为
周辰晨
2021/08/09
7170
高并发系统支撑---限流算法
有些场景并不能用缓存和降级来解决,比如写服务、频繁的复杂查询,因此需有一种手段来限制这些场景的并发/请求量,即限流。
一条老狗
2019/12/26
9060
并发编程-25 高并发处理手段之消息队列思路 + 应用拆分思路 + 应用限流思路
如果有大量的数据,在同一时间内直接写入数据库,势必对系统造成很大的压力。如果通过特定的方式采用限流的方式以很定的速率来写入数据库,那数据库压力就会小很多。
小小工匠
2021/08/17
8120
golang 源码分析:juju/ratelimit
https://github.com/juju/ratelimit 是一个基于令牌桶算法的限流器:令牌桶就是想象有一个固定大小的桶,系统会以恒定速率向桶中放 Token,桶满则暂时不放。漏桶算法和令牌桶算法的主要区别在于,"漏桶算法"能够强行限制数据的传输速率(或请求频率),而"令牌桶算法"在能够限制数据的平均传输速率外,还允许某种程度的突发传输。
golangLeetcode
2022/08/02
8330
常用限流策略——漏桶与令牌桶介绍
限流又称为流量控制(流控),通常是指限制到达系统的并发请求数,本文列举了常见的限流策略,并以gin框架为例演示了如何为项目添加限流组件。
luckpunk
2023/09/10
8660
常用限流策略——漏桶与令牌桶介绍
推荐阅读
相关推荐
高并发系统下,如何用限流算法优雅地保护你的服务?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验