Sentinel限流算法总结

文章目录

一、线程隔离

线程隔离有两种方式实现:

  • 线程池隔离:给每个服务调用业务分配一个线程池,利用线程池本身实现隔离效果
  • 信号量隔离:不创建线程池,而是计数器模式,记录业务使用的线程数量,达到信号量上限时,禁止新的请求。

Sentinel的线程隔离就是基于信号量隔离实现的。

二、滑动窗口算法

在熔断功能中,需要统计异常请求或慢请求比例,也就是计数。在限流的时候,要统计每秒钟的QPS,同样是计数。

设置一个窗口的大小,然后窗口是匀速往前滑动的,在一段时间范围内,请求落在同一个窗口的数量大于窗口阈值,就拒绝该请求。

sentinel中采用的计数器算法就是滑动窗口计数算法。

三、令牌桶算法

如图:

说明:

  • 以固定的速率生成令牌,存入令牌桶中,如果令牌桶满了以后,多余令牌丢弃。
  • 请求进入后,必须先尝试从桶中获取令牌,获取到令牌后才可以被处理。
  • 如果令牌桶中没有令牌,则请求等待或丢弃。

基于令牌桶算法,每秒产生的令牌数量基本就是QPS上限。

当然也有例外情况,例如:

  • 某一秒令牌桶中产生了很多令牌,达到令牌桶上限N,缓存在令牌桶中,但是这一秒没有请求进入。
  • 下一秒的前半秒涌入了超过2N个请求,之前缓存的令牌桶的令牌耗尽,同时这一秒又生成了N个令牌,于是总共放行了2N个请求。超出了我们设定的QPS阈值。

因此,在使用令牌桶算法时,尽量不要将令牌上限设定到服务能承受的QPS上限。而是预留一定的波动空间,这样我们才能应对突发流量。

Sentinel中的热点参数限流正是基于令牌桶算法实现的。

四、漏桶算法

漏桶算法与令牌桶相似,但在设计上更适合应对并发波动较大的场景。

简单来说就是请求到达后不是直接处理,而是先放入一个队列。而后以固定的速率从队列中取出并处理请求。之所以叫漏桶算法,就是把请求看做水,队列看做是一个漏了的桶。

如图:

说明:

  • 将每个请求视作"水滴"放入"漏桶"进行存储;
  • "漏桶"以固定速率向外"漏"出请求来执行,如果"漏桶"空了则停止"漏水";
  • 如果"漏桶"满了则多余的"水滴"会被直接丢弃。

漏桶的优势就是流量整型,不管并发量如何波动,经过漏桶处理后的请求一定是相对平滑的曲线。

sentinel限流中的排队等待功能正是基于漏桶算法实现的。

相关推荐
空中海7 天前
第六篇:可靠性篇 — Sentinel 熔断限流与 Seata 分布式事务
分布式·sentinel
JAVA面经实录9177 天前
如何选择适合项目的「限流 / 熔断 / 降级」方案
java·spring·kafka·sentinel·guava
蓝眸少年CY9 天前
(第十五篇)spring cloud之Sentinel实现熔断与限流
数据库·spring cloud·sentinel
无风听海11 天前
Python 哨兵值模式(Sentinel Value Pattern)深度解析
开发语言·python·sentinel
空中海12 天前
Redis 原理深度解析:持久化 × 主从复制 × Sentinel × Cluster × 性能排查全攻略
数据库·redis·sentinel
接着奏乐接着舞14 天前
Sentinel
sentinel
随风,奔跑14 天前
Spring Boot Alibaba(三)----Sentinel
spring boot·后端·sentinel
武超杰14 天前
Sentinel 安装启动 + 全规则详解 + Feign 整合 + 持久化
sentinel
青槿吖14 天前
Sentinel 进阶实战:Feign 整合 + 全局异常 + Nacos 持久化,生产环境直接用
java·开发语言·spring cloud·微服务·云原生·ribbon·sentinel
StackNoOverflow14 天前
Sentinel服务保护框架完全指南:从原理到实践
java·数据库·sentinel