【限流算法】

news2024/9/20 15:06:12

文章目录

  • 介绍
  • 算法原理
  • 适用场景
  • 令牌通算法实现
  • 限流算法

介绍

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

算法原理

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

适用场景

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

令牌通算法实现

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.coloradmin.cn/o/2146148.html

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

相关文章

第6天:趋势轮动策略开发(年化18.8%,大小盘轮动加择时)

原创内容第655篇&#xff0c;专注量化投资、个人成长与财富自由。 轮动策略是一种投资策略&#xff0c;它涉及在不同的资产类别、行业或市场之间进行切换&#xff0c;以捕捉市场机会并优化投资组合的表现。 这种策略的核心在于识别并利用不同资产或市场的相对强弱&#xff0c…

[数据集][目标检测]智慧养殖场肉鸡目标检测数据集VOC+YOLO格式3548张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3548 标注数量(xml文件个数)&#xff1a;3548 标注数量(txt文件个数)&#xff1a;3548 标注…

医学数据分析实训 项目九 糖尿病风险预测

文章目录 综合实践二 糖尿病遗传风险预测一、分析目标二、实现步骤三、数据准备四、特征工程五、模型构建六、性能度量七、提交要求 综合实践任务二 糖尿病遗传风险预测代码&#xff08;一&#xff09;数据准备&#xff08;二&#xff09;特征工程&#xff08;三&#xff09;模…

Selenium通过ActionBuilder模拟鼠标操作直接移动到指定坐标的注意事项

在目前&#xff08;2024-09-18&#xff09;得Selenium官方手册中&#xff0c;模拟鼠标操作基本上都是通过ActionChains完成的&#xff0c;唯独有一动作&#xff0c;是通过ActionBuilder完成的。 而前者ActionChains&#xff0c;主要是通过offset&#xff0c;也就是坐标偏移量来…

【Prometheus】jmx_prometheus_javaagent监控java应用

目录 一、概述 1.1 promethues简介 1.2 JMX Exporter简介 二、监控SparkHistoryServer实现 一、概述 1.1 promethues简介 promethues采集数据的方法很多&#xff0c;常用的是通过各种exporter去主机采集&#xff0c;然后有些程序是没有相关的exporter,所以有些时候会通过脚…

信息学奥赛报考指南

近年来&#xff0c;信息学奥林匹克竞赛&#xff08;NOI&#xff09;越来越受到家长和学生的重视。这项竞赛不仅能培养孩子的编程与算法思维&#xff0c;还为优秀的选手提供了进入国内顶尖大学的保送资格&#xff0c;并有机会参加国际级赛事。因此&#xff0c;许多家长都希望了解…

设计图纸加密方法知多少?小编给你讲清楚

一、对称加密 使用对称加密算法&#xff0c;对设计图纸进行加密。对称加密使用相同的密钥进行加密和解密&#xff0c;确保只有持有正确密钥的人能够解密文件。 二、非对称加密 使用非对称加密算法&#xff0c;进行设计图纸的加密。非对称加密使用公钥加密、私钥解密的方式&a…

机械设备产品资料方案介绍小程序系统开发制作

设备产品资料介绍小程序系统&#xff0c;是一家工业机械设备生产厂家为了更好的服务客户而定制开发的一套小程序系统&#xff0c;让用户通过小程序就可以了解公司产品介绍的详细参数、售后服务和产品操作手持等。 该小程序系统里面主要开发的功能模块有&#xff1a; 1、产品目…

如何在算家云搭建DynamiCrafter(图生视频)

一、模型简介 DynamiCrafter 是一种&#xff08;文本-&#xff09;图像到视频/图像动画的方法&#xff0c;旨在从条件图像和文本提示中生成短视频片段&#xff08;约 2 秒&#xff09;&#xff0c;可以将静止图像转换为动画。它使用了一种称为视频扩散先验的技术&#xff0c;可…

探索Facebook的黑暗面:数字化社交的双面剑

Facebook作为全球最大的社交平台&#xff0c;改变了我们的沟通和互动方式。虽然它带来了便利&#xff0c;但也存在不少隐忧。本文将探讨Facebook的负面影响&#xff0c;包括隐私问题、信息操控、心理健康危机及社交表面化等。 一、隐私问题&#xff1a;数据收集的隐忧 Facebo…

优思学院|如何从零开始自己学习六西格玛?

优思学院为学习六西格玛管理的学员&#xff0c;精心推荐了几本由浅入深、系统全面的书籍&#xff0c;帮助大家从入门到精通&#xff0c;逐步掌握六西格玛这一强大的管理工具。无论你是刚接触六西格玛的初学者&#xff0c;还是想在专业领域提升的高级学员&#xff0c;这几本书都…

硬件(驱动开发概念)

驱动程序开发 裸机驱动&#xff08;无操作系统&#xff09; Linux驱动 以计算机技术为基础&#xff0c;在软件和硬件层间可以被剪裁的专业硬件计算机系统 SOC&#xff1a;片上系统 Kernel&#xff1a;内核 x86 &#xff08;CISC:complex instruction set computer 复杂指令…

IEEE Electronic Library(IEL)数据库文献检索下载介绍及个人获取IEEE文献途径

一、数据库介绍 IEEE&#xff08;The Institute of Electrical and Electronics Engineers&#xff0c;电气电子工程师学会&#xff09;是目前全球最大的非营利性专业技术学会&#xff0c;在全球160多个国家拥有超过45万名会员。IEEE在电气电子、计算机、半导体、通讯、电力能…

24年蓝桥杯及攻防世界赛题-MISC-3

21 reverseMe 复制图片&#xff0c;在线ocr识别&#xff0c;https://ocr.wdku.net/&#xff0c;都不费眼睛。 22 misc_pic_again ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc/zsteg] └─$ zsteg misc_pic_again.png imagedata … text: “$$KaTeX parse error: Undefined…

方法:批量提取PPT幻灯片中图片

处理包含大量图片的PPT&#xff08;PowerPoint&#xff09;幻灯片已成为许多专业人士的日常任务之一。然而&#xff0c;手动从每张幻灯片中逐一提取图片不仅耗时耗力&#xff0c;还容易出错。为了提升工作效率&#xff0c;减少重复劳动&#xff0c;探索并实现一种高效批量提取P…

STM32F407单片机开发入门(二)STM32F407VET6单片机详解

文章目录 一.概要二.单片机型号命名规则三.STM32F407系统架构四.STM32F40VET6单片机启动流程五.STM32F40VET6单片机主要外设资源六.开发过程中查看芯片数据手册的必要性1.单片机外设资源情况2.STM32F407单片机内部框图3.STM32F407单片机管脚图4.STM32F407单片机每个管脚功能5.单…

球类目标检测系统源码分享

球类目标检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

IOS 26 实现歌单详情(UITableView)列表 ③

歌单详情完整效果 歌单列表分组头部效果 本节是在文章 IOS 25 实现歌单详情&#xff08;UITableView&#xff09;列表② 的基础上&#xff0c;实现歌单列表分组头部View。当歌单列表滑动头部View至顶部时&#xff0c;头部View不会因列表滑动而消失&#xff0c;会一直显示在顶部…

2024.9.18

1.已知网址www.hqyj.com截取出网址的每一个部分 菜单栏中 ----> 虚拟机 -----> 设置 -----> 网络适配器 选择桥接模式 菜单栏中 ----> 编辑 -----> 虚拟网络编辑器 更改设置 将桥接改成自动 如果桥接连不上网 尝试还原默认设置后&#xff0c;在重新连接桥接…

微信小程序的学生选课系统--论文源码调试讲解

第二章 开发技术介绍 此次管理系统的关键技术和架构由B/S结构、java和mysql数据库&#xff0c;是本系统的关键开发技术&#xff0c;对系统的整体、数据库、功能模块、系统页面以及系统程序等设计进行了详细的研究与规划。 2.1 系统开发平台 在该在线微信小程序的学生选课系统…