【限流算法】java实现固定时间窗口算法
本文实现了一种基于java的固定时间窗口计数器算法
固定时间窗口计数器算法思想:在固定的时间窗口内,可以允许固定数量的请求进入。超过数量就拒绝或者排队,等下一个时间段进入。
优点:和令牌桶相比,这种算法不需要去等待令牌生成的时间,在新的时间窗口,可以立即处理大量的请求。
缺点:在一个窗口临界点的前后时间,比如时间窗口是1分钟,在59秒和1分01秒同时突发大量请求,极端情况下可能会带来 2 倍的流量,系统可能承受不了这么大的突发性流量。
代码逻辑:新建一个本地缓存,每5s作为一个时间窗口,并作为缓存的key,原子类计数器作为缓存的value。每秒发送随机数量的请求,计算每个时间窗口内的请求数量,超出阈值则限流。
@Slf4j
public class WindowLimiter {//本地缓存,以时间戳为key,以原子类计数器为valueprivate LoadingCache<Long, AtomicLong> counter =CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build(new CacheLoader<Long, AtomicLong>() {@Overridepublic AtomicLong load(Long seconds) throws Exception {return new AtomicLong(0);}});private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);//设置限流阈值为15private long limit = 15;/*** 固定时间窗口* 每隔5s,计算时间窗口内的请求数量,判断是否超出限流阈值*/private void fixWindow() {scheduledExecutorService.scheduleWithFixedDelay(() -> {try {// time windows 5 slong time = System.currentTimeMillis() / 5000;//每秒发送随机数量的请求int reqs = (int) (Math.random() * 5) + 1;long num = counter.get(time).addAndGet(reqs);log.info("time=" + time + ",num=" + num);if (num > limit) {log.info("限流了,num=" + num);}} catch (Exception e) {log.error("fixWindow error", e);} finally {}}, 0, 1000, TimeUnit.MILLISECONDS);}
}
输出结果:
20:04:55.508 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815739,num=4
20:04:56.510 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815739,num=7
20:04:57.516 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815739,num=10
20:04:58.521 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815739,num=11
20:04:59.526 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815739,num=14
20:05:00.553 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815740,num=3
20:05:01.553 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815740,num=5
20:05:02.558 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815740,num=9
20:05:03.564 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815740,num=14
20:05:04.569 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - time=314815740,num=17
20:05:04.570 [pool-1-thread-3] INFO com.example.demo.limit.WindowLimiter - 限流了,num=17
【限流算法】java实现固定时间窗口算法相关推荐
- 【面试大全-高并发】-限流策略有哪些,滑动窗口算法和令牌桶区别,使用场景
参考思路:限流算法常用的几种实现方式有如下四种:计数器.滑动窗口.漏桶和令牌桶: ● 计数器: ○ 思想:在固定时间窗口内对请求进行计数,与阀值进行比较判断是否需要限流,一旦到了时间临界点,将计数器清 ...
- 限流算法-固定时间窗口
本文介绍了固定时间窗口限流算法. 前言 首先限流的算法有很多种,比如固定时间窗口限流算法.滑动时间窗口算法.漏桶算法.令牌桶算法,其余的算法后续我们会一一介绍. 一.限流场景 站在服务调用方的角度来说 ...
- sentinel滑动时间窗口算法学习
滑动时间窗口 先不说sentinel的算法实现,先说什么是滑动时间窗口, 我们在进行限流的时候,比如通过QPS进行限流,那假如我们以秒为单位,举个例子: 我设置了限流规则,qps是10 如果不使用滑动 ...
- sentinel 滑动时间窗口算法
sentinel 滑动时间窗口的算法 为什么要用滑动时间窗口算法? 互联网中最常见的一个问题:限流,即在一段时间内,限制访问某个接口的请求数. 要实现限流(或熔断降级),方法有很多,最基本的如计数器法 ...
- PYTHON/JAVA实现固定时间且自动发送邮件的程序
PYTHON 实现固定时间且自动发送邮件的程序 import smtplib from email.mime.text import MIMEText from email.header import ...
- Java 实现滑动时间窗口限流算法,你见过吗?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | dijia478 来源 | https://w ...
- JAVA实现滑动时间窗口
先上代码 package demo;import java.time.LocalTime; import java.util.LinkedList; import java.util.List; im ...
- 时间窗口算法用matlab,一种基于动态规划算法的时间窗口相关的参与者选择方法与流程...
本发明涉及一种移动群智感知中时间窗口相关的参与者选择方法,特别地,涉及一种基于动态规划算法的时间窗口相关的参与者选择方法. 背景技术: 在移动群智感知网络中,智能设备中嵌入了麦克风.相机.温度传感器. ...
- 基于界面的银行家算法java实现_java实现银行家算法(Swing界面)
java代码实现了银行家算法,界面写的个人认为还是较为细致的,完整的实现了找安全序列等算法功能,可作为参考学习银行家算法. 直接上代码:①界面展示方法: public void ShowFrame() ...
最新文章
- 苹果5年来盈利首次未超预期,但大中华区营收暴增83%
- Vue.js组件中v-model的使用
- ibatise 没有大于等于吗_库里+杜兰特并没有大于等于2!或许他和库里搭配将更强...
- 引用自己创建的css样式表_如何使用CSS创建联系表
- php 封装JavaScript类
- VC++ (四)动态内存
- 控件时出现“未能实例化控件******,VS2008 中无法使用ACTIVEX控件的解决
- 响应式设计就是这个时代最值得学习、时间的趋势
- 理解Visual Studio 解决方案文件格式(.sln)
- 双人五子棋游戏用C++实现
- msi2lmp不能用,mpi不能连接主机,解决办法看这里
- java商城答辩_毕业答辩-基于Java的网上购物商城的设计与实现.ppt
- 百度地图Javascript API 使用记录
- Spring 5.X+CXF 3.X 开发SOAP Web Service服务端实例
- 计算机组装与维修(一)
- 热度比肩以太坊的Cosmos生态现在发展得怎么样了?
- 解决Win10桌面和任务栏图标闪烁的问题
- 单个数码管动态显示(STM32F103C8T6)
- bzoj1123 BLO
- Day12:股海浮沉-锦囊妙计
热门文章
- linux io栈(读写流程)
- 【c#】键盘事件(keypress keydown keyup)
- 启用数据空间:让VirtualBox虚拟机中的Ubuntu 10.10和XP主机互通有无
- 设计模式之SOLID原则
- 微软学生中心DreamSpark
- h5页面跳转微信小程序页面
- 如果遇到提示错误 reactivity.esm-bundler.js?a1e9:337 Set operation on key “default“ failed: target is readonl
- python的知识体系_最新Python知识体系梳理
- 苹果审核报 3.2,如何解决
- 程序员带新人的几点思考