漏斗限流(leaky bucket)

漏斗限流(leaky bucket)

  • 介绍
  • 工作原理
  • leaky bucket实现示例:
  • 搭配pool池
    • pool.lua示例
    • 搭配示例
  • 对象池(pool)结合漏斗限流(leaky bucket)的好处:

介绍

漏斗限流(leaky bucket)是一种流量控制算法,用于限制在网络或系统中通过的数据量或请求速率。通常用于平滑网络流量或请求到达的速率,防止突发流量导致系统负载过高或网络拥塞。

工作原理

1. 漏斗模型:

  • 漏斗可以看作是一个容器,有一个固定的最大容量(即最大请求速率),漏嘴则控制了流出速率
  • 如果漏斗里的水量超过了当前漏口的处理能力,多余的水会溢出(即请求被限流或丢弃)

2. 处理流程:

  • 漏斗以固定速率处理请求,类似于水从漏斗底部流出的速度
  • 请求到达时,先判断漏斗当前的水量是否能容纳新的请求。如果可以,则接受请求并将水量增加;否则,拒绝请求或以某种方式处理溢出的请求

应用场景:

  • 网络流量控制:限制流过路由器或服务器的数据包速率,防止网络拥塞
  • API请求管理:限制API接口的访问频率,避免服务器过载
  • 消息队列消费速率控制:平滑处理从消息队列中获取的消息,防止消费者因处理速度不足导致消息堆积

leaky bucket实现示例:

-- 漏斗限流逻辑
local os_time = os.time
local mt = {}
mt.__index = mt-- 是否处于正常可通过状态
function mt:watering()local t_now = os_time()local leak_water = self.rate * (t_now - self.last_ts)if leak_water > 0 thenlocal left_water = self.water - leak_waterself.water = (left_water > 0) and left_water or 0self.last_ts = t_nowendif self.water < self.cap thenself.water = self.water + 1return trueendreturn false
end-- 重置
function mt:reset()self.water = 0
endlocal M = {}
function M.create_bucket(rate, cap)local bucket = {}bucket.rate = rate -- 漏斗每秒速率bucket.cap = cap -- 漏斗容量bucket.water = 0 -- 漏斗当前的水位bucket.last_ts = 0 -- 最近一次处理的时间return setmetatable(bucket, mt)
endreturn M

搭配pool池

pool.lua示例

用于管理可复用对象的创建、获取和释放
-- object pool, from: https://github.com/treamology/pool.lualocal type, pairs, table, setmetatable = type, pairs, table, setmetatable 
local pool = {}
local poolmt = {__index = pool}function pool.create(newObject, poolSize, maxPoolSize)if type(newObject) ~= "function" thenreturn nilendpoolSize = poolSize or 16maxPoolSize = (maxPoolSize and maxPoolSize >= poolSize) and maxPoolSize or 2 * poolSizelocal freeObjects = {}for _ = 1, poolSize dotable.insert(freeObjects, newObject())endreturn setmetatable({freeObjects = freeObjects,newObject = newObject,maxPoolSize = maxPoolSize},poolmt)
endfunction pool:obtain()return #self.freeObjects == 0 and self.newObject() or table.remove(self.freeObjects)
endfunction pool:free(obj, ...)if not obj thenreturn falseendif #self.freeObjects < self.maxPoolSize thentable.insert(self.freeObjects, obj)endif obj.reset then obj.reset(obj, ...) endreturn true
endfunction pool:clear()for k in pairs(self.freeObjects) doself.freeObjects[k] = nilend
endreturn pool

搭配示例

local leaky_bucket = require "leaky_bucket"
local pool = require "pool"
local bucketPool = nil -- 漏斗限流池local buckets = {} -- 漏限流对象池
local function new_bucket_object()return leaky_bucket.create_bucket(50, 80)
end
bucketPool = pool.create(new_bucket_object, 100, 200)local BUCKETS = setmetatable(buckets, {__index = function (t, id)t[id] = bucketPool:obtain()return t[id]end
})

对象池(pool)结合漏斗限流(leaky bucket)的好处:

1. 资源重复利用:

  • 对象池(pool)可以有效管理和重复利用漏斗限流对象。通过调用 pool.create(new_bucket_object, m, n) 创建的 bucketPool 对象池,可以预先创建并维护多个漏斗限流对象
  • 当需要使用漏斗限流对象时,通过 bucketPool:obtain() 方法从对象池中获取一个可用对象,而不是每次都重新创建

2. 减少资源消耗:

  • 漏斗限流对象通常包含一些初始化和配置,创建和销毁开销较大。通过对象池,可以避免频繁地创建和销毁漏斗限流对象,从而减少系统资源的消耗,提高性能和效率

3. 提高系统响应速度:

  • 由于对象池中已经预先创建了一定数量的漏斗限流对象,获取对象时只需从池中取出,并可能调用重置方法进行初始化,而不需要完全重新创建。这样可以大大缩短获取对象的响应时间,提高系统对漏斗限流需求的响应速度

4. 动态管理和限制:

  • 通过设置 maxPoolSize 参数,可以动态调整对象池的大小,确保不会因为对象池过小而导致获取对象失败。在需要时,可以根据系统负载和需求灵活地调整对象池的大小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ollama 配置多并发和多模型

ollama新版已经支持了并发和多模型同时运行了&#xff0c; 系统资源够的可以走起了 默认的ollama服务是不支持的&#xff0c; 需要自己进行调整&#xff0c; 调整的方式如下&#xff1a; Linux为例 通过调用 编辑 systemd 服务systemctleditollama.service 这将打开一个编辑器…

Changes Coming to NIAP Entropy Assessment Reports in 2025

“What do you say to a room full of DRBGs standing around you? Everyone, please be seeded.” -Quin, atsec tester When things change, it can help to approach that change with a light heart like this. Recently, NIAP announced that Entropy Assessment Rep…

结合gin框架在沙箱环境下实现电脑网站支付和当面支付

文章目录 配置支付宝开放平台编写代码测试电脑网站支付当面扫码支付 配置支付宝开放平台 支付宝开放平台 点击链接&#xff0c;扫码进入后&#xff0c;点击沙箱&#xff1a; 点击沙箱应用&#xff0c;可以看到APPID&#xff0c;接口加签方式选择系统默认密钥就行&#xff0…

基于Python的垃圾分类检测识别系统(Yolo4网络)【W8】

简介&#xff1a; 垃圾分类检测识别系统旨在利用深度学习和计算机视觉技术&#xff0c;实现对不同类别垃圾的自动识别和分类。应用环境包括Python编程语言、主流深度学习框架如TensorFlow或PyTorch&#xff0c;以及图像处理库OpenCV等&#xff0c;通过这些工具集成和优化模型&a…

第2天:项目结构与配置深入

第2天&#xff1a;项目结构与配置深入 目标 熟悉Django项目结构&#xff0c;配置基础设置。 任务概览 理解Django项目结构。配置settings.py。理解Django的URL配置。 详细步骤 理解Django项目结构 Django项目由一个或多个应用&#xff08;apps&#xff09;组成。每个应用…

js 实现图片纵向拼接并下载

js 使用canvas实现图片按照顺序拼接成纵向长图 /*** 图片拼接长图*/export default class ImageStitching {constructor(options) {this.imageUrls options.imageUrlsthis.images []this.imagesLoaded 0this.canvas nullthis.ctx nullthis.width options.width || 750th…

python判断一个数是不是偶数

在Python中&#xff0c;你可以使用模运算符 % 来判断一个数是否为偶数。模运算符会返回两个数相除的余数。如果一个数除以2的余数为0&#xff0c;那么这个数就是偶数。 以下是一个简单的Python函数&#xff0c;用于判断一个数是否为偶数&#xff1a; def is_even(n):return n…

成都爱尔林江院长建议近视防控从小做起,具体怎么做

预防近视应从小做起&#xff0c;知识储备多多益善。孩子如何做到近视防控&#xff1f; 成都爱尔眼科医院小儿眼科专家林江院长建议家长和孩子同时树立科学观念&#xff0c;让孩子拥有一个丰富多彩假期的同时强身健体也保护好眼睛。 不宅家、多户外 确保每天至少2个小时的户外…

【教程】SEO搜索优化怎么做?你必须知道的网站SEO诊断优化关键因素

在SEOer界流传着这样一句话,“内容为王,外链为皇,速度为后,内链为妃,代码为将,关键词为相,结构为城,更新为太子,工具为神兵”,我相信站长们对这条“黄金法则”一定都不陌生,其中“速度为后,工具为神兵”为土爹爹添加。毫不夸张地说,SEO(搜索引擎优化)就是大多数…

解锁5G新营销:视频短信的优势与全方位推广策略

随着5G时代的全面来临&#xff0c;企业的数字化转型步伐日益加快&#xff0c;视频短信作为新兴的数字营销工具&#xff0c;正逐步展现出其巨大的潜力。视频短信群发以其独特的形式和内容&#xff0c;将图片、文字、视频、声音融为一体&#xff0c;为用户带来全新的直观感受&…

线上盲盒小程序:前景展望

在移动互联网的浪潮下&#xff0c;线上盲盒小程序作为一种新兴的购物模式&#xff0c;具有广阔的发展前景和潜力。以下是对线上盲盒小程序未来前景的展望&#xff1a; 一、市场规模持续扩大 随着消费者需求的不断增长和市场竞争的加剧&#xff0c;线上盲盒小程序的市场规模将持…

【C#】scriptcs : 无法将“scriptcs”项识别为 cmdlet、函数、脚本文件或可运行程序的名

scriptcs : 无法将“scriptcs”项识别为 cmdlet、函数、脚本文件或可运行程序的名 最近在用vscode运行c#控制台程序是会出现上述的状况&#xff0c;几番周折之后找到了解决方法。 首先在电脑上安装scoop 然后运行powershell&#xff0c;分别输入 Set-ExecutionPolicy -Execu…

【TensorFlow深度学习】模型解释性工具与可解释AI技术简介

模型解释性工具与可解释AI技术简介 模型型解释性工具与可解释AI技术简介&#xff1a;洞悉“黑箱”的艺术1. LIME&#xff08;局部可解释模型-agnostic解释方法&#xff09;2. SHAP&#xff08;SHapley Additive Explanations&#xff09;3. Partial Dependence Plots (PDP)与IC…

无人机比赛有哪些?

无人机比赛项目可是多种多样&#xff0c;精彩纷呈呢&#xff01; 常见的比赛项目包括S形绕桩赛、平台起降赛、应用航拍、投掷物品和定点飞行等。这些项目不仅考验无人机的性能&#xff0c;更考验飞行员的操控技巧。 在S形绕桩赛中&#xff0c;飞行员需要操控无人机快速而准确…

Vue的测试策略:如何使用单元测试和端对端测试来确保Vue应用的质量

介绍 测试的重要性 在开发软件应用的过程中,测试具有重要的作用。它可以帮助开发者捕捉到程序中的错误和漏洞,保证软件的质量。功能性的测试可以帮助确认应用程序或系统满足了其功能需求。测试驱动的开发方式,如TDD(Test-Driven Development),也被广泛提倡并实践,因为…

03-QTWebEngine中使用qtvirtualkeyboard

qt提供了 virtualKeyboard 虚拟键盘模块&#xff0c;只需要在在main函数中最开始加入这样一句就可以了 qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); 但是在使用的时候遇到了一些问题&#xff1a; 1、中文输入的时候没有输入提示 Qvirt…

【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)

&#x1f525;引言 本篇将深入解析单链表:探索底层逻辑&#xff0c;理解底层是如何实现并了解该接口实现的优缺点&#xff0c;以便于我们在编写程序灵活地使用该数据结构。 &#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &…

springboot 酒庄内部管理系统(源码+sql+论文)

绪论 1.1 系统研究目的意义 随着信息技术的不断发展&#xff0c;我们现在已经步入了信息化的时代了&#xff0c;而信息时代的代表便是网络技术的日渐成熟&#xff0c;而现在网络已经和我们的生活紧密的联系起来了&#xff0c;我们不敢想象没有网络我们的生活会像怎么样&#…

postman工具的使用

Postman工具详细使用指南 Postman是一款广泛应用的API开发、测试和调试工具。其强大的功能和友好的用户界面,使其成为开发人员和测试人员首选的API工具之一。以下将详细介绍Postman的各项功能及其具体使用方法,帮助用户充分利用这款工具。 1. 安装和初始配置 1.1 下载与安…

QQ登录测试用例

QQ登录测试用例 常见测试方法&#xff08;可参考软件测试<用例篇>&#xff09; 等价类&#xff1a; 1、有效等价类 &#xff1a;满足需求的数据集合 2、无效等价类&#xff1a;不满足需求的数据集合 边界值错误猜测法场景法 QQ测试用例设计&#xff1a;xmind 需要完整…