【限流算法】

news/2024/9/24 2:27:51/

文章目录

介绍

令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。

算法原理

在这里插入图片描述
令牌桶算法基于以下核心概念:
令牌桶:一个虚拟的容器,用来存放固定数量的令牌。
令牌填充速率:系统以固定的速率向桶中添加令牌。
令牌消耗:每当一个数据包发送时,就从桶中移除一个k如果桶中没有令牌,数据包将被延迟发送或丢弃,直到桶中有足够的令牌。

适用场景

网络带宽管理:控制用户的网络流量,防止滥用。
API速率限制:限制API调用频率,保护后端服务。
云服务提供商:为不同级别的用户提供不同速率的服务。
任务调度:限制任务执行的速率,避免资源争用。

令牌通算法实现

java">package com.schdule.util;import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;public class TokenBucket {/*** 桶的最大容量*/private  int  capacity;/*** 当前桶的令牌数*/private  AtomicInteger tokens;/*** 令牌通的生成速率*/private  int refillRate;/*** 上次填充令牌的时间*/private  long lastRefillTimestamp;public TokenBucket(int capacity, int refillRate) {this.capacity = capacity;this.tokens = new AtomicInteger(capacity);this.refillRate = refillRate;this.lastRefillTimestamp = System.nanoTime();}public synchronized boolean tryConsuse(){refill();if(tokens.get()>0){tokens.decrementAndGet();return true;}return false;}/*** 填充令牌,根据时间间隔计算应该添加多少令牌*/public void refill(){long now=System.nanoTime();long timeSinceLastRefill = now - lastRefillTimestamp;long tokensToAdd = timeSinceLastRefill * refillRate / TimeUnit.SECONDS.toNanos(1);if(tokensToAdd>0){int newTokenCount=Math.min(capacity,tokens.get()+(int)tokensToAdd);tokens.set(newTokenCount);lastRefillTimestamp=now;}}public static void main(String[] args) throws InterruptedException {// 创建一个容量为10,速率为每秒2个令牌的令牌桶TokenBucket tokenBucket = new TokenBucket(10, 2);// 模拟多个请求,每隔500毫秒尝试一次for (int i = 0; i < 20; i++) {boolean allowed = tokenBucket.tryConsuse();System.out.println("Request " + (i + 1) + (allowed ? " allowed" : " denied"));Thread.sleep(500);}}}

限流算法

1‌.计数器算法‌是最简单也是最容易实现的限流算法。它通过维护一个计数器,每当有请求到达时,计数器加一,如果计数器的值超过了预设的阈值,则拒绝新的请求。这种算法实现简单,但容易受到突发流量的影响,因为请求可能会在同一时间窗口内集中到达,导致计数器迅速达到上限。

2‌.滑动窗口算法‌是对计数器算法的改进,通过将时间划分为多个小窗口,每个小窗口内限制请求的数量。与计数器算法相比,滑动窗口算法能够更好地处理突发流量,因为它允许在每个小窗口内有一定的请求量,而不会因为一个时间点的请求过多而导致整个时间窗口的请求被拒绝。

‌3.令牌桶算法‌通过控制令牌的生成速度来限制请求的处理速度。所有请求在处理前都需要获取一个可用的令牌。令牌以一定的速率生成,当桶满时,新生成的令牌会被丢弃或拒绝。这种算法能够有效地限制请求的处理速率,即使面对突发流量也能保持一定的服务能力。

‌4.漏桶算法‌可以看作是一个具有固定容量的请求队列,请求以一定的速率流入和流出。当请求流入的速度超过流出速度时,多余的请求会被丢弃。漏桶算法能够平滑地处理请求,防止突发流量对系统造成过大压力。


http://www.ppmy.cn/news/1529602.html

相关文章

2024网络安全与黑客技术:零基础自学指南

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、…

基于PHP+MySQL组合开发的在线客服源码系统 聊天记录实时保存 带完整的安装代码包以及搭建部署教程

系统概述 随着互联网技术的飞速发展&#xff0c;企业与客户之间的沟通方式日益多样化&#xff0c;在线客服系统作为连接企业与客户的桥梁&#xff0c;其重要性不言而喻。然而&#xff0c;市场上现有的在线客服系统往往存在成本高、定制性差、维护复杂等问题。针对这些痛点&…

Spring源码学习:SpringMVC(2)DispatcherServlet初始化【子容器9大组件】

目录 DispatcherServlet类图HttpServletBean#initnew ServletConfigPropertyValues() FrameworkServlet#initServletBeaninitWebApplicationContextcreateWebApplicationContextconfigureAndRefreshWebApplicationContext DispatcherServlet内部9大组件初始化初识9大组件Dispat…

在Web开发中使用和风天气接口

介绍 和风天气是一个提供全球天气预报和气象数据的服务平台&#xff0c;支持多种语言&#xff0c;提供实时天气、未来天气预报、空气质量指数、生活建议等多种气象数据&#xff0c;可以广泛用于网页开发、移动应用和物联网设备等场景。 开发文档&#xff1a;文档 | 和风天气开…

Semaphore UI --Ansible webui

1、安装python python下载地址 https://www.python.org/downloads/ 选好版本下载 wget https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tar.xz安装编译工具 sudo dnf groupinstall "Development Tools"安装依赖包 dnf install bzip2-devel ncurses-deve…

问题——IMX6UL的uboot无法ping主机或Ubuntu

主要描述可能的方向&#xff0c;不涉具体过程&#xff0c;详细操作可以查阅网上相关教程 跟随正点原子教程测试以太网端口时&#xff0c;即便按照步骤多次尝试也无法ping通&#xff0c;后补充了些许网络工程基础知识解决了这个问题。 uboot无法ping主机或Ubuntu有多种可能&…

C++语言设计期末考试知识点

C语言设计期末考试知识点 1. 基础语法 变量和数据类型&#xff1a; int, float, double, char, bool 等基本数据类型。常量&#xff1a;const 关键字。变量的作用域&#xff1a;局部变量、全局变量。 输入输出&#xff1a; cin 和 cout&#xff1a;标准输入输出流。格式化输出…

中间件:maxwell、canal

文章目录 1、底层原理&#xff1a;基于mysql的bin log日志实现的&#xff1a;把自己伪装成slave2、bin log 日志有三种模式&#xff1a;2.1、statement模式&#xff1a;2.2、row模式&#xff1a;2.3、mixed模式&#xff1a; 3、maxwell只支持 row 模式&#xff1a;4、maxwell介…