Sentinel 是如何实现分布式限流的?

3502 篇文章 107 订阅

随着近些年系统稳定性要求越来越高,限流是保障服务高可用的方式之一,尤其是在微服务架构中,对接口或资源进行限流可以有效地保障服务的可用性和稳定性。

在众多限流平台中 Sentinel 凭着丰富功能特性和多次阿里双十一的线上实践,成为最热门限流平台之一,Sentinel 是阿里巴巴提供的一种限流、熔断中间件,与RateLimiter相比,Sentinel提供了丰富的限流、熔断功能。它支持控制台配置限流、熔断规则,支持集群限流,并可以将相应服务调用情况可视化。

本文就Sentinel相关特性进行分析并测试并对底层原理进行分析,为后续相关系统建设积累经验。

一、总体流程

之前我们学习过限流比较主流的三种算法:漏桶,令牌桶,滑动窗口。而Sentinel采用的是最后一种,滑动窗口来实现限流的。

先来了解一下总体流程:

上面的图是官网的图,从设计模式上来看,典型的的责任链模式。外部请求进来后,要经过责任链上各个节点的处理,而Sentinel的限流、熔断就是通过责任链上的这些节点实现的。

要想深入了解原理,还是得从源码上入手,下面直接进入Sentinel的源码阅读。

二、源码阅读

2.1 源码阅读入口及流程总结

读源码先得找到源码入口。我们经常使用@ SentinelResource来标记一个方法,可以将这个被@ SentinelResource标记的方法看成是一个Sentinel资源。因此,我们以@ SentinelResource为入口,找到其切面,看看切面拦截后所做的工作,就可以明确Sentinel的工作原理了。直接看注解@SentinelResource的切面代码(SentinelResourceAspect)。

可以清晰的看到Sentinel的行为方式。进入SentinelResource切面后,会执行SphU.entry方法,在这个方法中会对被拦截方法做限流和熔断的逻辑处理。

如果触发熔断和限流,会抛出BlockException,我们可以指定blockHandler方法来处理BlockException。而对于业务上的异常,我们也可以配置fallback方法来处理被拦截方法调用产生的异常。

所以,Sentinel熔断限流的处理主要是在SphU.entry方法中,其主要处理逻辑见下图源码。

可见,在SphU.entry方法中,Sentinel实现限流、熔断等功能的流程可以总结如下:

  • 获取Sentinel上下文(Context);

  • 获取资源对应的责任链;

  • 生成资源调用凭证(Entry);

  • 执行责任链中各个节点。

2.2  责任链的执行

再来看下面这张图,是不是很清晰了?

NodeSelectorSlot用于获取资源对应的Node,并构建Node调用树,将SentinelSource的调用链路以Node Tree的形式组起来。ClusterBuilderSlot为当前Node创建对应的ClusterNode,聚合相同资源对应的不同Context的Node,后续的限流依据就是这个ClusterNode。

ClusterNode继承自StatisticNode,记录着相应资源处理的一些统计数据。StatisticSlot用于更新资源调用的相关计数,用于后续的限流判断使用。FlowSlot根据资源对应Node的调用计数,判断是否进行限流。

至此,Sentinel的责任链执行逻辑就完整了。

三、原理总结

通过对Sentinel源码的梳理,可以很清晰的理解Sentinel的限流过程,总结如下:

  • 三大组件Context、Entry、Node,是Sentinel的核心组件,各类信息及资源调用情况都由这三大类持有;

  • 采用责任链模式完成Sentinel的信息统计、熔断、限流等操作;

  • 责任链中NodeSelectSlot负责选择当前资源对应的Node,同时构建node调用树;

  • 责任链中ClusterBuilderSlot负责构建当前Node对应的ClusterNode,用于聚合同一资源对应不同Context的Node;

  • 责任链中的StatisticSlot用于统计当前资源的调用情况,更新Node与其对用的ClusterNode的各种统计数据;

  • 责任链中的FlowSlot根据当前Node对应的ClusterNode(默认)的统计信息进行限流;

  • 资源调用统计数据(例如PassQps)使用滑动时间窗口进行统计;

  • 所有工作执行完毕后,执行退出流程,补充一些统计数据,清理Context。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,我知道一些常用的分布式限流工具。以下是一些比较流行的限流工具: 1. Redis: 使用 Redis 可以简单地实现限流,特别是滑动窗口限流。 2. Guava RateLimiter: Guava 是 Google 的 Java 工具包,其中 RateLimiter 可以提供高效的令牌桶限流。 3. Bucket4J: Bucket4J 是一个 Java 库,可以提供功能强大的令牌桶和漏桶限流。 4. Netflix Zuul: Netflix Zuul 是一个微服务网关,内置了对限流的支持,可以很方便地在应用程序的边界处实现限流。 这些工具都有不同的优势和特性,请根据您的具体需求和环境选择适合您的工具。 ### 回答2: 有一些好用的分布式限流工具可以帮助我们实现系统的流量控制和限流,以下是其中几个常用的: 1. Alibaba Sentinel(阿里巴巴开源):一个功能强大的分布式系统流量防卫士,支持实时的流量控制、熔断降级、系统保护等功能,提供了丰富的配置和管理方式。 2. Spring Cloud Gateway:Spring Cloud生态系统中的一个网关工具,可以通过使用过滤器和限流机制来实现分布式限流,支持基于QPS、令牌桶等算法进行限流控制。 3. Nacos(阿里巴巴开源):一个用于动态服务发现、配置管理和服务治理的平台,其中包含了限流的功能,可以通过配置限流规则来实现请求的限制。 4. Redis+Lua脚本:通过在Redis中使用Lua脚本来实现限流功能。可以利用Redis的高性能和原子操作特性,结合令牌桶、漏桶等算法来实现流量控制。 5. ZooKeeper:一个分布式协调服务,可以用于实现分布式限流。可以利用ZooKeeper的有序节点特性和Watch机制来控制请求的并发量。 这些工具各有特点,具体选择取决于应用场景和需求。在实际使用时,需要根据系统的规模、性能需求和业务特点等因素,综合考虑选择合适的分布式限流工具。 ### 回答3: 当今的分布式系统越来越复杂和庞大,限流是保证系统稳定性和高可用性的重要策略之一。以下是我所知的几个好用的分布式限流工具: 1. Redis:Redis是一个高性能的内存数据存储系统,通过其提供的分布式缓存和限流功能可以实现简单而高效的限流逻辑。需要利用Redis的计数器或令牌桶等数据结构,将请求和访问进行计数,在达到限流阈值时进行拒绝或延迟处理。 2. SentinelSentinel是阿里巴巴开源的一款分布式流量控制组件,它提供了流量控制、熔断降级、系统负载等功能。通过在每个服务节点上配置规则,可以统一限制请求的数量,避免系统被过多的请求压垮。 3. Nginx:Nginx是一款高性能的开源Web服务器,也可以用作分布式限流工具。通过配置Nginx反向代理服务器的限流策略,可以限制请求的并发数、连接数等,而且能够根据不同的URL或IP设置不同的限流策略。 4. Alibaba Yet Another Distributed Rate Limiter (Sentinel):Sentinel是一个用于流量控制的分布式限流组件,由Alibaba开源。它具有动态规则的特性,可以基于各种参数和维度(如QPS、线程数、CPU负载等)对请求进行限流,以保护系统免受过载。 以上是一些我所知道的分布式限流工具,每个工具都有其独特的特点和适用场景。根据具体的需求和系统架构,选择适合的工具进行分布式限流是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值