java 限流策略

2023-11-01

概要

在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃。此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速率,就进行等待、排队、降级、拒绝服务等。在限流时,常见的两种算法是漏桶和令牌桶算法算法。

限流算法

令牌桶(Token Bucket)、漏桶(leaky bucket)和计数器算法是最常用的三种限流的算法。

1. 令牌桶算法


令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。 当桶满时,新添加的令牌被丢弃或拒绝。

令牌桶算法示例
public class RateLimiterDemo {
    private static RateLimiter limiter = RateLimiter.create(5);

    public static void exec() {
        limiter.acquire(1);
        try {
            // 处理核心逻辑
            TimeUnit.SECONDS.sleep(1);
            System.out.println("--" + System.currentTimeMillis() / 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Guava RateLimiter 提供了令牌桶算法可用于平滑突发限流策略。
该示例为每秒中产生5个令牌,每200毫秒会产生一个令牌。
limiter.acquire() 表示消费一个令牌。当桶中有足够的令牌时,则直接返回0,否则阻塞,直到有可用的令牌数才返回,返回的值为阻塞的时间。

2. 漏桶算法


它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量,数据可以以任意速度流入到漏桶中。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶为空,则不需要流出水滴,如果漏桶(包缓存)溢出,那么水滴会被溢出丢弃。

3. 计数器限流算法

计数器限流算法也是比较常用的,主要用来限制总并发数,比如数据库连接池大小、线程池大小、程序访问并发数等都是使用计数器算法。

使用计数器限流示例1
public class CountRateLimiterDemo1 {

    private static AtomicInteger count = new AtomicInteger(0);

    public static void exec() {
        if (count.get() >= 5) {
            System.out.println("请求用户过多,请稍后在试!"+System.currentTimeMillis()/1000);
        } else {
            count.incrementAndGet();
            try {
                //处理核心逻辑
                TimeUnit.SECONDS.sleep(1);
                System.out.println("--"+System.currentTimeMillis()/1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                count.decrementAndGet();
            }
        }
    }
}

使用AomicInteger来进行统计当前正在并发执行的次数,如果超过域值就简单粗暴的直接响应给用户,说明系统繁忙,请稍后再试或其它跟业务相关的信息。

弊端:使用 AomicInteger 简单粗暴超过域值就拒绝请求,可能只是瞬时的请求量高,也会拒绝请求。

使用计数器限流示例2
public class CountRateLimiterDemo2 {

    private static Semaphore semphore = new Semaphore(5);

    public static void exec() {
        if(semphore.getQueueLength()>100){
            System.out.println("当前等待排队的任务数大于100,请稍候再试...");
        }
        try {
            semphore.acquire();
            // 处理核心逻辑
            TimeUnit.SECONDS.sleep(1);
            System.out.println("--" + System.currentTimeMillis() / 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            semphore.release();
        }
    }
}

使用Semaphore信号量来控制并发执行的次数,如果超过域值信号量,则进入阻塞队列中排队等待获取信号量进行执行。如果阻塞队列中排队的请求过多超出系统处理能力,则可以在拒绝请求。

相对Atomic优点:如果是瞬时的高并发,可以使请求在阻塞队列中排队,而不是马上拒绝请求,从而达到一个流量削峰的目的。


想了解更多精彩内容请关注我的公众号

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 限流策略 的相关文章

  • MacBook M1 配置 tensorflow开发环境

    MacBook M1 配置 tensorflow开发环境 方法一 提示 目前MacBook M1在安装和配置深度学习的框架tensorflow上由于兼容性的问题存在着很多困扰 本文将给出详细的安装说明 文章目录 MacBook M1 配置
  • XiaoMi NoteBook Pro EFI 黑苹果引导文件

    TM1701 和 TM1707 规格 详细信息 电脑型号 小米笔记本电脑Pro 15 6 MX150 GTX 处理器 英特尔 酷睿 i5 8250U i7 8550U 处理器 内存 8GB 16GB 三星 DDR4 2400MHz 硬盘 三

随机推荐

  • ubuntu安装dlib

    电脑内部环境很多 传统pip无法安装 3 0环境有dlib 最近用2 7的环境 发现没有 好久没装了 试了一些方法并不work 还是用的老指令 conda install c menpo dlib 18 18
  • Word调用ChatGPT

    目录 前言 一 ChatGPT是什么 二 使用步骤 1 申请ChatGPT的API KEY 2 创建宏模块 3 添加工具栏按钮 4 使用此模块的方法 总结 前言 此文章目的是将ChatGPT作为工具在Word中直接使用 以快速生成自己想要的
  • 《计算机网络》(第8版)第三章 数据链路层 知识点总结

    文章目录 1 数据链路层的三个基本问题 1 1 封装成帧 framing 1 2 透明传输 1 3 差错检测 1 3 1 循环冗余检验CRC Cycle Redundancy Check 1 3 2 FCS计算图 2 点到点协议PPP及其透
  • 毕业设计 - 树莓派寝室宿舍门禁刷卡系统 - 物联网 单片机 嵌入式

    文章目录 0 前言 1 前言 2 主要器件 3 实物效果 4 树莓派读取 RC522 RFID 标签 5 mg90s 控制原理 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕
  • 公司网络故障总结

    公司网络故障总结 Author skate Time 2007 6 8 今天早上一到公司 刚坐下 买的早饭还没吃呢 就有人打电话反映不能上网 我以为是个别机器的问题 但我还是检测一下 查看网络是否畅通 查看结果是不通 于是就要分析原因 要尽
  • Redis基础与高可用集群架构进阶详解

    一 NoSQL简介 1 问题引入 每年到了过年期间 大家都会自觉自发的组织一场活动 叫做春运 以前我们买票都是到火车站排队 后来呢 有了 12306 有了它以后就更方便了 我们可以在网上买票 但是带来的问题 大家也很清楚 春节期间买票进不去
  • 西瓜书作业4.4(基于基尼指数划分决策树,未剪枝/预剪枝/后剪枝)

    文章目录 题目 未减枝 思想 画图 预剪枝 思想 画图 后剪枝 思想 画图 比较总结 参考 全部代码 画图代码 题目 试编程实现基于基尼指数进行划分选择的决策树算法 为表4 2中数据生成预剪枝 后剪枝决策树 并与未剪枝决策树进行比较 牢骚
  • 密码学与网络安全 - 11 密码学Hash函数

    11 密码学Hash函数 Hash函数输入长度可变 而输出长度固定 合格的Hash函数输出应该均匀分布 看起来随机 Hash函数两个要求 1 抗碰撞性 找到两个不同的输入对应相同的输出在计算上不可行 2 单向性 通过Hash值找到输入值在计
  • Vue突然报错 doesn‘t work properly without JavaScript enabled

    突然报错未启用JavaScript 下午演示项目的时候突然给我整了一出JavaScript未启用 当场就把我整尴尬了 然后我怀疑是不是写的路由守卫有问题就注释了再试 发现问题还在 然后经过各种骚操作以后 发现还是报这个js未启用 当场我就不
  • Idea 激活插件IDEA Eval Reset食用

    在setting中的Plugins中点击设置小图标 点击第一个选项 添加远程仓库 2 点击 号 输入 https plugins zhile io 3 搜索 IDEA Eval Reset 安装 4 Help gt Eval Restart
  • 短短半小时 创建自己的个性操作系统

    短短半小时 创建自己的个性操作系统 邹震 大家认为桌面使用比较困难 但是前段时间推出一款Whitefin 而且可以在半小时内自己创建个性操作系统 今天我们采访一下 熊伟 先生 熊伟 先生您好 我们想请您谈一下Whitefin这个的来源 熊伟
  • 分数构造方法java,Java--构造方法

    1 构造方法 类中的特殊方法 主要用于创建并初始化对象 2 特点 构造方法的名称与类名完全相同 没有返回值类型 定义的时候不用写 void 普通方法没有返回值的时候 要写void 创建对象时 触发构造方法的调用 不可以通过句点手动调用 方法
  • Typescript学习——接口

    接口 interface TypeScript 的核心原则之一就是对 值 所具有的结构进行类型检查 而接口的作用就是为这些类型命名或为你的第三方代码定义契约 相当于定义了值的类型 用法 const foo params name strin
  • C语言: 数组指针/指针数组等相关的选择题目

    文章目录 写在前面 形参和实参 二维数组传参 字符数组 二维数组 函数指针数组 参数匹配 多级指针 写在前面 本篇总结的是和指针相关的有难度的选择题 并对这些题进行解析和分析 形参和实参 下面程序的运行结果是什么 include
  • C/S和B/S的区别和优缺点

    一 CS BS架构定义 1 C S Client Server 客户端 服务器结构 C S结构在技术上很成熟 它的主要特点是交互性强 具有安全的存取模式 网络通信量低 响应速度快 利于处理大量数据 因为客户端要负责绝大多数的业务逻辑和UI展
  • 关于Python爬虫Xpath的一切都在这里了

    Xpath是python爬虫过程中 非常重要的一种用来定位的语法 PART 01 开始使用 首先我们需要得到一个 HTML 源代码 用来模拟爬取网页中的源代码 先下载lxml 包 pip install lxml 准备HTML源代码 fro
  • DMA基本原理

    常用的外设DMA使能库函数 DMA基本原理 1 作用 为CPU减负 2 DMA框图 3 1 每个通道都直接连接专用的硬件DMA请求 都支持软件触发 这些通过软件来配置 2 在七个请求间的优先权可以通过软件编程设置 共有四级 很高 高 中等和
  • 批处理隐藏自身窗口

    转载自 批处理隐藏自身窗口 大多数时候 使用批处理执行一些任务 但是批处理的黑色命令窗口会一直存在很烦人 可以通过两种方式 隐藏bat脚本 方法1 直接在 bat 文件最前边加上以下内容 echo off if 1 h goto begin
  • VPython三维仿真(NO.4) 创建坐标系

    目录 目的 画坐标系方法 画坐标系代码 坐标系效果图 纠正飞机坐标系 源代码 目的 在后续的章节中 飞机或其他模型需要参照物才能明白模型是如何运动的 本节介绍建立笛卡尔坐标系的方法 画坐标系方法 使用VPython的圆柱体 cylinder
  • java 限流策略

    概要 在大数据量高并发访问时 经常会出现服务或接口面对暴涨的请求而不可用的情况 甚至引发连锁反映导致整个系统崩溃 此时你需要使用的技术手段之一就是限流 当请求达到一定的并发数或速率 就进行等待 排队 降级 拒绝服务等 在限流时 常见的两种算