当前位置: 首页 > news >正文

常见限流算法

限流是指在高并发、大流量请求的情况下,限制新的流量对系统的访问,以保证系统服务的安全性。常见的限流算法及其详细介绍如下:

计数器算法(Fixed Window Counter)

  • 原理:使用一个固定时间窗口内的计数器来记录请求的数量。若计数器超过设定的阈值,则拒绝后续请求。
  • 实现:定义一个时间窗口(如1秒),在窗口内维护一个计数器。接收到请求时,计数器加1。若计数器超过阈值,则限流;否则允许。
  • 特点:简单易实现,适用于低精度的限流需求。
  • 局限:窗口边界处可能产生突发流量。例如,当前窗口接近阈值,新窗口开始时流量激增。

滑动窗口计数器(Sliding Window Counter)

  • 原理:将固定窗口进一步细分为更小的时间片段,根据当前时间的滑动,将多个时间片段内的请求数量进行累加。
  • 实现:将时间窗口(如1秒)分为多个时间片段(如100毫秒),使用一个队列存储各时间片段的计数。请求时移除过期的时间片段,并累计最新的请求数。
  • 特点:缓解固定窗口算法的边界问题,流量控制更加平滑。
  • 局限:实现较为复杂,存储和计算开销增加。

漏桶算法(Leaky Bucket)

  • 原理:系统按固定速率处理请求,若队列满,则丢弃新请求。可以平滑突发流量,将其转化为稳定输出。
  • 实现:维护一个队列表示漏桶,按固定速率处理请求。
  • 特点:控制请求处理速率。
  • 局限:丢弃超量请求可能导致用户体验下降。

令牌桶算法(Token Bucket)

  • 原理:系统按固定速率向桶中加入“令牌”,每次请求需要消耗一个令牌,若令牌不足,则拒绝请求。
  • 实现:维护一个桶存储令牌,设定令牌生成速率和桶容量。若桶中有足够令牌,则允许请求;否则拒绝。
  • 特点:支持突发流量处理(通过允许提前消费桶中积累的令牌),限流效果较平滑。
  • 局限:相比漏桶算法实现稍复杂。

基于时间戳的限流算法

  • 原理:记录每个请求的时间戳,根据当前时间窗口计算历史请求数量,决定是否限流。
  • 实现:使用一个有序集合(如Redis的zset)存储时间戳。请求时清理超出时间窗口的过期时间戳,并统计剩余时间戳数量。
  • 特点:精度高,适合精细化限流。
  • 局限:存储开销大,尤其在高并发下可能性能较低。

分布式限流算法

  • 原理:在分布式系统中,利用Redis等缓存系统的特性,实现跨节点的流量管理。
  • 实现:将限流逻辑分布到不同节点,按哈希分配请求。通过分布式锁协调各节点的限流操作。
  • 特点:支持跨节点的流量管理。
  • 局限:需要额外的分布式协调开销。

基于队列的限流算法

  • 原理:通过消息队列(如RabbitMQ、Kafka)对流量进行控制。
  • 实现:请求先进入消息队列,消费者以固定速率处理队列中的请求。
  • 特点:适合异步处理场景,天然支持流量削峰。
  • 局限:实时性较差。

在实际应用中,常根据业务需求结合多种限流算法。例如,漏桶算法控制请求速率,令牌桶算法允许短时间内的突发流量,Redis滑动日志实现分布式限流等。选择合适的限流算法,可以在保护系统的同时,尽可能提高流量的利用率和用户体验。

http://www.dtcms.com/a/54298.html

相关文章:

  • Shell编程概述与Shell变量
  • 建筑兔零基础自学python记录39|实战词云可视化项目——章节分布10(上)
  • 【Flink银行反欺诈系统设计方案】4.Flink CEP 规则表刷新方式
  • Redis相关面试题
  • Mybatis集合嵌套查询,三级嵌套
  • JAVA与计算机网络基础
  • 生物信息学与计算生物学:各自概念、主要内容、区别与联系、发展展望?
  • 微服务的春天:基于Spring Boot的架构设计与实践
  • 如何把GUI做的像Web一样美观:Python PyQt6特性介绍,如何结合QSS美化
  • C++中`const` 和 `static` 关键字详解
  • 34.二叉树进阶3(C++STL 关联式容器,set/map的介绍与使用)
  • 【mysql系】mysql启动异常Can‘t create test file localhost.lower-test
  • 【大模型基础_毛玉仁】1.4 语言模型的采样方法
  • Excel中COUNTIF用法解析
  • 【笔记】记一次easyExcel中注解ExcelProperty映射字段赋值无效问题
  • dify 工作流 迭代
  • ArcGIS操作:15 计算点的经纬度,并添加到属性表
  • NDT 代价函数
  • 音视频入门基础:RTP专题(15)——FFmpeg源码中,获取RTP的视频信息的实现
  • K8S学习之基础十一:k8s中容器钩子
  • 日新F1、瑞研F600P 干线光纤熔接(熔接损耗最大0.03DB)
  • three学习记录
  • 秋云 ucharts echarts 高性能跨全端图表组件导入
  • P1443 马的遍历(BFS)
  • 企业日常工作中常用的 Linux 操作系统命令整理
  • Vue 与 Element UI 深度探秘:从 Array.isArray 到动态绑定的技术之旅!✨
  • HTML 表单 (form) 的作用解释
  • 【STM32F103ZET6——库函数】11.捕获红外信号
  • Linux基本操作指令1
  • WPS工具栏添加Mathtype加载项