【go从零单排】Rate Limiting限流

🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。
📗概念
在 Go 中,速率限制(Rate Limiting)是一种控制请求速率的技术,通常用于防止过载、保护资源或实现公平访问。速率限制可以通过多种方式实现,包括使用通道、定时器和其他同步原语。
💻代码
通道限流
使用通道速率限制:代码使用了两种速率限制机制。
第一部分通过定时器限制请求的处理频率,第二部分允许在短时间内处理多个请求(突发请求),但仍然会受到后续请求的限制。
package mainimport ("fmt""time"
)func main() {// 创建一个缓冲通道 requests,容量为 5requests := make(chan int, 5)for i := 1; i <= 5; i++ {requests <- i // 向通道中发送请求}close(requests) // 关闭通道// 创建一个定时器,每 200 毫秒发出一次信号limiter := time.Tick(200 * time.Millisecond)// 处理请求for req := range requests {<-limiter // 等待定时器信号fmt.Println("request", req, time.Now()) // 输出请求和当前时间}// 创建一个用于突发请求的通道,容量为 3burstyLimiter := make(chan time.Time, 3)// 初始填充突发通道for i := 0; i < 3; i++ {burstyLimiter <- time.Now() // 向通道中发送当前时间}// 启动一个 goroutine,不断向 burstyLimiter 发送时间go func() {for t := range time.Tick(200 * time.Millisecond) {burstyLimiter <- t // 每 200 毫秒向通道中发送时间}}()// 创建一个缓冲通道 burstyRequests,容量为 5burstyRequests := make(chan int, 5)for i := 1; i <= 5; i++ {burstyRequests <- i // 向通道中发送请求}close(burstyRequests) // 关闭通道// 处理突发请求for req := range burstyRequests {<-burstyLimiter // 等待从 burstyLimiter 中取出时间fmt.Println("request", req, time.Now()) // 输出请求和当前时间}
}
Token Bucket 算法
Token Bucket 算法允许突发流量,但会限制长期的请求速率。每个请求消耗一个令牌,令牌以固定速率生成。
package mainimport ("fmt""time"
)func main() {// 创建一个通道作为令牌桶tokenBucket := make(chan struct{}, 3) // 最多 3 个令牌// 启动一个 goroutine 生成令牌go func() {for {tokenBucket <- struct{}{} // 每 200 毫秒放入一个令牌time.Sleep(200 * time.Millisecond)}}()// 处理请求for i := 1; i <= 10; i++ {<-tokenBucket // 等待获取令牌fmt.Println("Request", i, "at", time.Now())}
}
Leaky Bucket 算法
Leaky Bucket 算法是另一种速率限制方法,允许请求以固定速率流出。请求被放入一个“桶”中,如果桶满了,则新请求会被丢弃。
package mainimport ("fmt""time"
)func main() {// 创建一个通道作为桶bucket := make(chan struct{}, 3) // 桶的容量为 3// 启动一个 goroutine 持续从桶中流出go func() {for {time.Sleep(200 * time.Millisecond) // 每 200 毫秒流出一个请求select {case <-bucket:// 从桶中流出default:// 桶为空,什么也不做}}}()// 处理请求for i := 1; i <= 10; i++ {select {case bucket <- struct{}{}: // 尝试将请求放入桶中fmt.Println("Request", i, "at", time.Now())default:fmt.Println("Request", i, "dropped at", time.Now())}time.Sleep(100 * time.Millisecond) // 模拟请求间隔}
}
🔍理解
- 速率限制 是控制请求频率的重要手段,能够有效防止系统过载。
- 基于通道的实现 简单易用,适合基本的速率限制。
- Token Bucket 和 Leaky Bucket 算法 提供了更灵活的速率控制,适合复杂的应用场景。
Go 的并发特性使得实现这些算法变得简单和高效。通过 goroutine 和通道,可以轻松地管理并发请求和速率限制。
目前对go的理解还不能很好的理解到限流的强大,还需继续努力💪
💪无人扶我青云志,我自踏雪至山巅。

相关文章:
【go从零单排】Rate Limiting限流
🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在 Go 中,速率限制(Rate Limiting)是一种控制…...
解析Eureka的架构
1. 引言 1.1 Eureka的定义与背景 Eureka是由Netflix开发的一个RESTful服务,用于服务发现。它是微服务架构中的一个核心组件,主要用于管理服务的注册和发现。Eureka允许服务提供者注册自己的服务信息,同时也允许服务消费者查询可用的服务&am…...
AI变现,做数字游民
在数字化时代,AI技术的迅猛发展不仅改变了各行各业的生产方式,还为普通人提供了前所未有的变现机会。本文将探讨如何利用AI技术实现变现,成为一名数字游民,享受自由职业带来的便利与乐趣。 一、AI技术的变现潜力 AI技术以其强大…...
linux-vlan
# VLAN # 1.topo # 2.创建命名空间 ip netns add ns1 ip netns add ns2 ip netns add ns3 # 3.创建veth设备 ip link add ns1-veth0 type veth peer name ns21-veth0 ip link add ns3-veth0 type veth peer name ns23-veth0 # 4.veth设备放入命名空间,启动接口 ip link set n…...
前端跨域~简述
前言 :绿蚁新醅酒,红泥小火炉 第一:前端跨域(粗谈概念) 1. 疑惑 当前端请求后端接口不通,浏览器控制台出现类似信息,则需要解决跨域 Access to XMLHttpRequest at ‘http://47.100.214.160:10…...
GIN:逼近WL-test的GNN架构
Introduction 在 图卷积网络GCN 中我们已经知道图神经网络在结点分类等任务上的作用,但GIN(图同构神经网络)给出了一个对于图嵌入(graph embedding)更强的公式。 GIN,图同构神经网络,致力于解…...
NIST密码学未来展望:Naughty Step 上的 SHA-1、3DES 和 SHA-224
1. 引言 NIST 几十年来一直致力于推动密码学标准的发展,2024年10月,其发布了Transitioning the Use of Cryptographic Algorithms and Key Lengths 草案: 概述了 SHA-1(为160位哈希算法) 将在不久的将来退役…...
go 集成gorm 数据库操作
一、什么是gorm GORM 是一个用于 Go 语言的 ORM(对象关系映射)库,它提供了一种简单而强大的方式来与数据库进行交互。GORM 支持多种数据库,包括 MySQL、PostgreSQL、SQLite、SQL Server 等,并且提供了丰富的功能&…...
进程 线程 和go协程的区别
进程和线程是操作系统中两个重要的执行单元,理解它们的区别对于编程和系统设计非常重要。以下是它们的主要区别: ### 进程(Process) 定义:进程是一个正在执行的程序的实例,具有独立的地址空间。 资源&…...
STM32获取SHT3X温湿度芯片数据
目录 一、概述 二、单次数据采集模式的测量 1、配置说明 2、代码实现方式 三、周期性数据采集模式的测量 1、配置说明 2、代码实现方式 四、完整代码下载链接 一、概述 SHT3X是Sensirion公司推出的一款高精度、完全校准的温湿度传感器,基于CMOSens技术。它提…...
卸载miniconda3
1. 找到miniconda目录,删除。 rm -rf miniconda3/ 2. 编辑bashrc sudo vim .bashrc setup路径改回anaconda3的,注释掉“>>> conda initialize >>>”和"<<< conda initialize <<<"之间的miniconda的语…...
游戏中的设计模式及杂项
概述 如果要做以下游戏功能会用到哪些设计模式。比如创建一个人物角色,这个角色可以装备刀,然后角色可以用刀砍怪物,造成流血。 对于这个游戏功能,可以使用以下设计模式: 工厂模式(Factory Pattern&#x…...
Docker网络和overlay的基础讲解
本人发现了两篇写的不错的文章:Docker网络 - docker network详解-CSDN博客,Docker 容器跨主机通信 overlay_docker overlay 网络-CSDN博客 因为这两篇文章中含有大量的例子,新手看起来毫不费力。于是我偷了个小懒,在本篇文章中没有…...
分布式数据库:深入探讨架构、挑战与未来趋势
引言 在数字化时代,数据已成为企业的核心资产。随着数据量的爆炸性增长和业务需求的多样化,传统的集中式数据库已难以满足现代应用对于高可用性、可扩展性和性能的需求。分布式数据库以其独特的优势,如数据的高可用性、容错性和可扩展性&…...
基于Springboot+Vue的仓库管理系统 (含源码数据库)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…...
基于立体连接与开源链动 2+1 模式的新商业路径探索
摘要:本文深入剖析了立体连接的内涵,包括其核心关键词、连接路径与主体,同时详细阐述了开源链动 2 1 模式、AI 智能名片和 S2B2C 商城小程序源码的特点与功能。在此基础上,深入研究这些要素的融合方式及其在商业实践中的应用&…...
开启鸿蒙开发之旅:核心组件及其各项属性介绍——布局容器组件
写在前面 组件的结构 rkTS通过装饰器 Component 和 Entry 装饰 struct 关键字声明的数据结构,构成一个自定义组件。 自定义组件中提供了一个 build 函数,开发者需在该函数内以链式调用的方式进行基本的 UI 描述 今天我们要学习的就是写在build 函数里的系…...
RabbitMQ 全面解析:语法与其他消息中间件的对比分析
1. 引言 在分布式系统和微服务架构中,消息中间件扮演着重要的角色。它们能够解耦服务、平衡负载、提高系统的可扩展性和可靠性。RabbitMQ 是其中广受欢迎的一种。本文将从 RabbitMQ 的基础概念、语法介绍、以及与其他消息中间件的对比角度,全面剖析其在…...
Three.js 搭建3D隧道监测
Three.js 搭建3D隧道监测 Three.js 基础元素场景scene相机carema网络模型Mesh光源light渲染器renderer控制器controls 实现3d隧道监测基础实现道路实现隧道实现多个摄像头点击模型进行属性操作实现点击模型发光效果 性能监视器stats引入使用 总结完整代码 我们将通过three.js技…...
「IDE」集成开发环境专栏目录大纲
✨博客主页何曾参静谧的博客📌文章专栏「IDE」集成开发环境📚全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定…...
十大经典排序算法解析与实现
## 1. 十大经典排序算法技术解析### 1.1 算法分类体系 排序算法可分为两大技术类别:**比较类排序**: - 通过元素间比较确定相对次序 - 时间复杂度下限为O(nlogn) - 典型代表:快速排序、堆排序、归并排序**非比较类排序**: - 不依赖…...
3分钟解决Word论文格式难题:免费获取APA第7版参考文献样式终极指南
3分钟解决Word论文格式难题:免费获取APA第7版参考文献样式终极指南 【免费下载链接】APA-7th-Edition Microsoft Word XSD for generating APA 7th edition references 项目地址: https://gitcode.com/gh_mirrors/ap/APA-7th-Edition 还在为Word中找不到APA第…...
Java笔记——JMM
在多线程编程中,共享变量的可见性、操作的原子性以及指令的重排序,常常成为导致程序出现诡异Bug的罪魁祸首。而Java之所以能够成为并发编程的首选语言之一,很大程度上归功于其强大的Java内存模型(Java Memory Model, JMMÿ…...
Kimi-VL-A3B-Thinking Chainlit定制化开发:添加历史记录/多用户会话/图片标注功能
Kimi-VL-A3B-Thinking Chainlit定制化开发:添加历史记录/多用户会话/图片标注功能 1. 项目背景与模型介绍 Kimi-VL-A3B-Thinking是一款基于混合专家架构(MoE)的开源视觉语言模型(VLM),在多模态推理和长上下文理解方面表现出色。该模型仅激活2.8B参数就…...
FTDI FT2232H USB转JTAG实战指南:MPSSE配置与多设备调试
1. FT2232H与JTAG基础入门 第一次接触FT2232H这块芯片时,我完全被它的多功能性震惊了。这块小小的USB转接芯片不仅能处理UART通信,还能通过MPSSE引擎模拟JTAG、SPI、I2C等多种协议。对于嵌入式开发者来说,这简直就是调试神器。 FT2232H最吸引…...
别再拷贝sxs文件夹了!Win10教育版1903安装.NET 3.5最简方案(实测有效)
彻底解决Win10安装.NET 3.5报错0x800F081F的高效方案 每次在Win10上安装.NET Framework 3.5时遇到0x800F081F错误,都让人抓狂。网上那些让你拷贝sxs文件夹的教程,99%都在误导人。作为一位经历过无数次失败的老手,我要分享的是经过上百次验证的…...
ES核心索引机制深度解析:从“正排”与“倒排”的底层原理到实战应用场景
1. 正排索引与倒排索引的本质区别 第一次接触Elasticsearch时,我被"正排"和"倒排"这两个概念绕得头晕。直到有次做商品搜索功能,才真正理解它们的差异。想象你面前有两本电话簿:一本按人名排序(正排ÿ…...
OneMore插件:让OneNote效率倍增的全方位解决方案
OneMore插件:让OneNote效率倍增的全方位解决方案 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore 当你在OneNote中处理复杂表格时,是否曾因缺乏…...
const 变量的存储位置
const 变量的存储位置:不是绝对的只读区!这是 C/C 面试/学习高频易错点,核心结论:const 只修饰「只读权限」,不直接决定存储位置,变量放哪里,由变量的「作用域/生命周期」决定。一、分情况讲清楚…...
为什么你的Flask农业API总在灌溉高峰期崩?Python高并发部署的4层熔断架构设计(实测QPS提升6.8倍)
第一章:为什么你的Flask农业API总在灌溉高峰期崩?Python高并发部署的4层熔断架构设计(实测QPS提升6.8倍) 当全省智能灌溉系统在每日清晨5:00–7:00集中调度水阀、上传土壤墒情数据时,基于默认配置的Flask API常出现进程…...
