当前位置:首页 > 科技  > 软件

面试官:限流的常见算法有哪些?

来源: 责编: 时间:2024-04-19 09:22:06 297观看
导读限流的实现算法有很多,但常见的限流算法有三种:计数器算法、漏桶算法和令牌桶算法。1.计数器算法计数器算法是在一定的时间间隔里,记录请求次数,当请求次数超过该时间限制时,就把计数器清零,然后重新计算。当请求次数超过间

KTN28资讯网——每日最新资讯28at.com

限流的实现算法有很多,但常见的限流算法有三种:计数器算法、漏桶算法和令牌桶算法。KTN28资讯网——每日最新资讯28at.com

1.计数器算法

计数器算法是在一定的时间间隔里,记录请求次数,当请求次数超过该时间限制时,就把计数器清零,然后重新计算。当请求次数超过间隔内的最大次数时,拒绝访问。KTN28资讯网——每日最新资讯28at.com

计数器算法的实现比较简单,但存在“突刺现象”。KTN28资讯网——每日最新资讯28at.com

突刺现象是指,比如限流 QPS(每秒查询率)为 100,算法的实现思路就是从第一个请求进来开始计时,在接下来的 1 秒内,每来一个请求,就把计数加 1,如果累加的数字达到了 100,后续的请求就会被全部拒绝。等到 1 秒结束后,把计数恢复成 0,重新开始计数。如果在单位时间 1 秒内的前 10 毫秒处理了 100 个请求,那么后面的 990 毫秒会请求拒绝所有的请求,我们把这种现象称为“突刺现象”。KTN28资讯网——每日最新资讯28at.com

计数器算法的简单实现代码如下:KTN28资讯网——每日最新资讯28at.com

import java.util.Calendar;import java.util.Date;import java.util.Random;public class CounterLimit {    // 记录上次统计时间    static Date lastDate = new Date();    // 初始化值    static int counter = 0;    // 限流方法    static boolean countLimit() {        // 获取当前时间        Date now = new Date();        Calendar calendar = Calendar.getInstance();        calendar.setTime(now);        // 当前分        int minute = calendar.get(Calendar.MINUTE);        calendar.setTime(lastDate);        int lastMinute = calendar.get(Calendar.MINUTE);        if (minute != lastMinute) {            lastDate = now;            counter = 0;        }        ++counter;        return counter >= 100; // 判断计数器是否大于每分钟限定的值。    }    // 测试方法    public static void main(String[] args) {        for (; ; ) {            // 模拟一秒            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }            Random random = new Random();            int i = random.nextInt(3);            // 模拟1秒内请求1次            if (i == 1) {                if (countLimit()) {                    System.out.println("限流了" + counter);                } else {                    System.out.println("没限流" + counter);                }            } else if (i == 2) { // 模拟1秒内请求2次                for (int j = 0; j < 2; j++) {                    if (countLimit()) {                        System.out.println("限流了" + counter);                    } else {                        System.out.println("没限流" + counter);                    }                }            } else { // 模拟1秒内请求10次                for (int j = 0; j < 10; j++) {                    if (countLimit()) {                        System.out.println("限流了" + counter);                    } else {                        System.out.println("没限流" + counter);                    }                }            }        }    }}

2.漏桶算法

漏桶算法的实现思路是,有一个固定容量的漏桶,水流(请求)可以按照任意速率先进入到漏桶里,但漏桶总是以固定的速率匀速流出,当流入量过大的时候(超过桶的容量),则多余水流(请求)直接溢出。如下图所示:KTN28资讯网——每日最新资讯28at.com

KTN28资讯网——每日最新资讯28at.com

漏桶算法提供了一种机制,通过它可以让突发流量被整形,以便为系统提供稳定的请求,比如 Sentinel 中流量整形(匀速排队功能)就是此算法实现的,如下图所示:KTN28资讯网——每日最新资讯28at.com

KTN28资讯网——每日最新资讯28at.com

更多 Sentinel 内容详见:https://mp.weixin.qq.com/s/nF5f18BP8hscqIEmIFRN8QKTN28资讯网——每日最新资讯28at.com

3.令牌桶算法

令牌按固定的速率被放入令牌桶中,桶中最多存放 N 个令牌(Token),当桶装满时,新添加的令牌被丢弃或拒绝。当请求到达时,将从桶中删除 1 个令牌。令牌桶中的令牌不仅可以被移除,还可以往里添加,所以为了保证接口随时有数据通过,必须不停地往桶里加令牌。由此可见,往桶里加令牌的速度就决定了数据通过接口的速度。我们通过控制往令牌桶里加令牌的速度从而控制接口的流量。令牌桶的实现原理如下图所示:KTN28资讯网——每日最新资讯28at.com

KTN28资讯网——每日最新资讯28at.com

4.漏桶算法 VS 令牌桶算法

漏桶算法是按照常量固定速率流出请求的,流入请求速率任意,当流入的请求数累积到漏桶容量时,新流入的请求被拒绝。令牌桶算法是按照固定速率往桶中添加令牌的,请求是否被处理需要看桶中的令牌是否足够,当令牌数减为零时,拒绝新的请求。令牌桶算法允许突发请求,只要有令牌就可以处理,允许一定程度的突发流量。漏桶算法限制的是常量流出速率,从而使突发流入速率平滑。KTN28资讯网——每日最新资讯28at.com

比如服务器空闲时,理论上使用漏桶算法服务器可以直接处理一次洪峰(一次洪水过程的最大流量),但是漏桶算法处理请求的速率是恒定的,因此,前期服务器资源只能根据恒定的漏水速度逐步处理请求,无法直接处理这次洪峰。而使用令牌桶算法就不存在这个问题,因为它可以先把令牌桶一次性装满,处理一次洪峰之后再走限流。KTN28资讯网——每日最新资讯28at.com

总结

限流的常见算法有以下 3 种:KTN28资讯网——每日最新资讯28at.com

  • 计数器算法:实现简单,但有突刺现象;
  • 漏桶算法:固定速率处理请求,处理任意流量更加平滑,可以实现流量整形;
  • 令牌桶算法:通过控制桶中的令牌实现限流,可以处理一定的突发流量,比如处理一次洪峰。

本文链接:http://www.28at.com/showinfo-26-83991-0.html面试官:限流的常见算法有哪些?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: RabbitMQ实现延迟队列的技术探讨

下一篇: 详解 C++ 实现 K-means 算法

标签:
  • 热门焦点
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • 让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 微软发布Windows 11新版 引入全新任务栏状态

    近日,微软发布了Windows 11新版,而Build 22563更新主要引入了几周前曝光的平板模式任务栏等,系统更流畅了。更新中,Windows 11加入了专门针对平板优化的任务栏
Top