当前位置: 首页 > news >正文

【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限流

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 中&#xff0c;速率限制&#xff08;Rate Limiting&#xff09;是一种控制…...

解析Eureka的架构

1. 引言 1.1 Eureka的定义与背景 Eureka是由Netflix开发的一个RESTful服务&#xff0c;用于服务发现。它是微服务架构中的一个核心组件&#xff0c;主要用于管理服务的注册和发现。Eureka允许服务提供者注册自己的服务信息&#xff0c;同时也允许服务消费者查询可用的服务&am…...

AI变现,做数字游民

在数字化时代&#xff0c;AI技术的迅猛发展不仅改变了各行各业的生产方式&#xff0c;还为普通人提供了前所未有的变现机会。本文将探讨如何利用AI技术实现变现&#xff0c;成为一名数字游民&#xff0c;享受自由职业带来的便利与乐趣。 一、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…...

前端跨域~简述

前言 &#xff1a;绿蚁新醅酒&#xff0c;红泥小火炉 第一&#xff1a;前端跨域&#xff08;粗谈概念&#xff09; 1. 疑惑 当前端请求后端接口不通&#xff0c;浏览器控制台出现类似信息&#xff0c;则需要解决跨域 Access to XMLHttpRequest at ‘http://47.100.214.160:10…...

GIN:逼近WL-test的GNN架构

Introduction 在 图卷积网络GCN 中我们已经知道图神经网络在结点分类等任务上的作用&#xff0c;但GIN&#xff08;图同构神经网络&#xff09;给出了一个对于图嵌入&#xff08;graph embedding&#xff09;更强的公式。 GIN&#xff0c;图同构神经网络&#xff0c;致力于解…...

NIST密码学未来展望:Naughty Step 上的 SHA-1、3DES 和 SHA-224

1. 引言 NIST 几十年来一直致力于推动密码学标准的发展&#xff0c;2024年10月&#xff0c;其发布了Transitioning the Use of Cryptographic Algorithms and Key Lengths 草案&#xff1a; 概述了 SHA-1&#xff08;为160位哈希算法&#xff09; 将在不久的将来退役&#xf…...

go 集成gorm 数据库操作

一、什么是gorm GORM 是一个用于 Go 语言的 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它提供了一种简单而强大的方式来与数据库进行交互。GORM 支持多种数据库&#xff0c;包括 MySQL、PostgreSQL、SQLite、SQL Server 等&#xff0c;并且提供了丰富的功能&…...

进程 线程 和go协程的区别

进程和线程是操作系统中两个重要的执行单元&#xff0c;理解它们的区别对于编程和系统设计非常重要。以下是它们的主要区别&#xff1a; ### 进程&#xff08;Process&#xff09; 定义&#xff1a;进程是一个正在执行的程序的实例&#xff0c;具有独立的地址空间。 资源&…...

STM32获取SHT3X温湿度芯片数据

目录 一、概述 二、单次数据采集模式的测量 1、配置说明 2、代码实现方式 三、周期性数据采集模式的测量 1、配置说明 2、代码实现方式 四、完整代码下载链接 一、概述 SHT3X是Sensirion公司推出的一款高精度、完全校准的温湿度传感器&#xff0c;基于CMOSens技术。它提…...

卸载miniconda3

1. 找到miniconda目录&#xff0c;删除。 rm -rf miniconda3/ 2. 编辑bashrc sudo vim .bashrc setup路径改回anaconda3的&#xff0c;注释掉“>>> conda initialize >>>”和"<<< conda initialize <<<"之间的miniconda的语…...

游戏中的设计模式及杂项

概述 如果要做以下游戏功能会用到哪些设计模式。比如创建一个人物角色&#xff0c;这个角色可以装备刀&#xff0c;然后角色可以用刀砍怪物&#xff0c;造成流血。 对于这个游戏功能&#xff0c;可以使用以下设计模式&#xff1a; 工厂模式&#xff08;Factory Pattern&#x…...

Docker网络和overlay的基础讲解

本人发现了两篇写的不错的文章&#xff1a;Docker网络 - docker network详解-CSDN博客&#xff0c;Docker 容器跨主机通信 overlay_docker overlay 网络-CSDN博客 因为这两篇文章中含有大量的例子&#xff0c;新手看起来毫不费力。于是我偷了个小懒&#xff0c;在本篇文章中没有…...

分布式数据库:深入探讨架构、挑战与未来趋势

引言 在数字化时代&#xff0c;数据已成为企业的核心资产。随着数据量的爆炸性增长和业务需求的多样化&#xff0c;传统的集中式数据库已难以满足现代应用对于高可用性、可扩展性和性能的需求。分布式数据库以其独特的优势&#xff0c;如数据的高可用性、容错性和可扩展性&…...

基于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 模式的新商业路径探索

摘要&#xff1a;本文深入剖析了立体连接的内涵&#xff0c;包括其核心关键词、连接路径与主体&#xff0c;同时详细阐述了开源链动 2 1 模式、AI 智能名片和 S2B2C 商城小程序源码的特点与功能。在此基础上&#xff0c;深入研究这些要素的融合方式及其在商业实践中的应用&…...

开启鸿蒙开发之旅:核心组件及其各项属性介绍——布局容器组件

写在前面 组件的结构 rkTS通过装饰器 Component 和 Entry 装饰 struct 关键字声明的数据结构&#xff0c;构成一个自定义组件。 自定义组件中提供了一个 build 函数&#xff0c;开发者需在该函数内以链式调用的方式进行基本的 UI 描述 今天我们要学习的就是写在build 函数里的系…...

RabbitMQ 全面解析:语法与其他消息中间件的对比分析

1. 引言 在分布式系统和微服务架构中&#xff0c;消息中间件扮演着重要的角色。它们能够解耦服务、平衡负载、提高系统的可扩展性和可靠性。RabbitMQ 是其中广受欢迎的一种。本文将从 RabbitMQ 的基础概念、语法介绍、以及与其他消息中间件的对比角度&#xff0c;全面剖析其在…...

Three.js 搭建3D隧道监测

Three.js 搭建3D隧道监测 Three.js 基础元素场景scene相机carema网络模型Mesh光源light渲染器renderer控制器controls 实现3d隧道监测基础实现道路实现隧道实现多个摄像头点击模型进行属性操作实现点击模型发光效果 性能监视器stats引入使用 总结完整代码 我们将通过three.js技…...

「IDE」集成开发环境专栏目录大纲

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「IDE」集成开发环境&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定…...

MySQL-初识数据库

目录 一、数据库基础概念 1、SQL 2、数据&#xff08;Data&#xff09; 3、数据库&#xff08;DB&#xff09; 4、数据库管理系统DBMS 5、数据库系统DBS 6、关系模型&#xff08;Relational Model&#xff09; 7、E-R图 8、常见的数据库 9、数据库基本操作 一、数据库…...

初始 html

html 文件结构 html 标签是整个 html 文件的根标签(最顶层标签) head 标签中写页面的属性. body 标签中写的是页面上显示的内容 title 标签中写的是页面的标题 <html><head><title>这是一个标题</title></head><body></body> <…...

前端 call、bind、apply的实际使用

目录 一、call 1、继承的子类可以使用父类的方法 2、可以接收任意参数 二、call、apply、bind比较 1、案例一 2、案例二 三、总结 这个三个方法都是改变函数的this指向的方法。 一、call 代码&#xff1a; const obj{uname:"pink"}function fn(){console.log…...

非关系型数据库NoSQL的类型与优缺点对比

NoSQL数据库根据数据模型和应用场景主要分为四种类型&#xff1a;键值型、列族型、文档型和图形型。以下是对每种类型的详细描述&#xff0c;包括其应用场景、优缺点的比较&#xff1a; 1. 键值型数据库 (Key-Value Store) 典型代表 RedisMemcachedAmazon DynamoDB 应用场景…...

面试击穿mysql

Mysql三大范式: 第一范式&#xff08;1NF&#xff09;&#xff1a; 不符合第一范式的典型情况是在一个字段中存放多种不同类型的详细信息。例如&#xff0c;在商品表中&#xff0c;若将商品名称、价格和类型都存储在同一个字段中&#xff0c;会带来诸多弊端。首先&#xff0c;在…...

PyQt5超详细教程终篇

PyQt5超详细教程 前言 接&#xff1a; [【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;](【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;-CSDN博客) 建议把代码复制到pycahrm等IDE上面看实际效果&#xff0c;方便理…...

Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别

目录 一、概念 1、纹理过滤 2、邻近过滤 3、线性过滤 二、邻近过滤和线性过滤的区别 三、源码下载 一、概念 1、纹理过滤 当纹理被应用到三维物体上时&#xff0c;随着物体表面的形状和相机视角的变化&#xff0c;会导致纹理在渲染过程中出现一些问题&#xff0c;如锯齿…...

Elasticsearch实战应用:从入门到精通

在当今这个数据爆炸的时代&#xff0c;如何快速、有效地从海量数据中检索信息&#xff0c;已经成为了许多企业和开发者面临的挑战。Elasticsearch&#xff0c;作为一个基于Lucene的搜索引擎&#xff0c;以其强大的全文搜索能力、分布式特性以及易用性&#xff0c;成为了解决这一…...

axios平替!用浏览器自带的fetch处理AJAX(兼容表单/JSON/文件上传)

fetch 是啥&#xff1f; fetch 函数是 JavaScript 中用于发送网络请求的内置 API&#xff0c;可以替代传统的 XMLHttpRequest。它可以发送 HTTP 请求&#xff08;如 GET、POST 等&#xff09;&#xff0c;并返回一个 Promise&#xff0c;从而简化异步操作 基本用法 /* 下面是…...

【优选算法 — 滑动窗口】水果成篮 找到字符串中所有字母异位词

水果成篮 水果成篮 题目描述 因为只有两个篮子&#xff0c;每个篮子装的水果种类相同&#xff0c;如果从 0 开始摘&#xff0c;则只能摘 0 和 1 两个种类 &#xff1b; 因为当我们在两个果篮都装有水果的情况下&#xff0c;如果再走到下一颗果树&#xff0c;果树的水果种类…...

苏州教育网站建设/推广计划书范文

某日某站某博水民甲&#xff1a;我要买股票赚大钱&#xff0c;放消息啊方消息啊&#xff0c;我要更多消息水民乙&#xff1a;顶……n日后仍然没有消息水民甲&#xff1a;博主是一XXX&#xff0c;为什么不放消息&#xff1f;水民乙&#xff1a;博主高人啊&#xff0c;应该有内线…...

建设团队网站/疫情放开最新消息今天

http://blog.flexexamples.com/2007/11/13/removing-the-default-drop-shadow-from-a-linechart-chart-in-flex/转载于:https://www.cnblogs.com/myssh/archive/2010/10/12/1849125.html...

自己做图片网站/北京seo学校

https://developer.tizen.org/downloads/sample-web-applications https://01.org/html5webapps/webapps 转载于:https://www.cnblogs.com/androidme/p/3250006.html...

网站的设计思路/网络推广公司可不可靠

大表中海量历史数据的更新与删除一直是令DBA非常头痛的事情&#xff0c;在表已经分区的前提下我们还可以利用并行或者truncate parition等手段来为UPDATE或者DELETE提速&#xff0c; 但是如果对象是普通的非分区对表(non-partitioned heap table)的话&#xff0c;似乎就没有太好…...

深圳的网站建设公司/上海不限关键词优化

1. 问题描述 双色球中&#xff0c;红色球选号规则&#xff1a;红色球可以在1-33个编号中任意选择6个。 问题&#xff1a;红色球全部选中的概率为多少&#xff1f; 2. 代码&#xff1a; package v1ch03.BigIntegerTest;import java.math.*; import java.util.*;/*** This pr…...

西宁网站建设模板/seo技术培训海南

这次主要说一下系统服务启动相关命令某些服务在开机的时候启动能不能执行跟你的/etc/rc.d/init.d 里头的服务设定项目有关ntsysv       < 目前的run-level 下的设定修改启动项ntsysv --level 5  < 不同run-level 下的设定修改启动项这些要注意一下运行的级别ser…...