阿里的 Sentinel 是一个开源的流量控制、熔断降级和系统负载保护的库,主要用于保护服务稳定性和资源可用性。它通过限流、熔断降级、系统负载保护等策略来实现服务的高可用。Sentinel 的服务限流工作原理主要包括以下几个方面:
- 限流算法:Sentinel 提供了两种限流算法,分别为漏桶算法(Leaky Bucket)和令牌桶算法(Token Bucket)。漏桶算法是通过固定容量的漏桶来控制流出速率,而令牌桶算法则通过固定速率生成令牌来控制流入速率。这两种算法都可以用来进行限流,具体选择哪种算法取决于你的业务需求。
- 规则配置:Sentinel 支持通过 API、控制台和配置文件等多种方式进行限流规则的配置。你可以根据需要为每个资源设置不同的限流阈值和策略。
- 限流处理:当请求到达 Sentinel 时,它会首先根据限流算法和规则判断当前请求是否需要被限流。如果需要限流,Sentinel 可以采用不同的限流处理策略,如快速失败、等待排队等。对于被限流的请求,Sentinel 会返回一个特定的错误码,通常为 429。
- 实时监控与统计:Sentinel 提供了实时监控和统计功能,可以帮助你了解系统的运行状态,以及限流规则的效果。你可以通过 Sentinel 的控制台查看实时的限流数据,也可以将这些数据导出到其他监控系统进行分析。
- 动态调整:Sentinel 支持动态调整限流规则,当系统的负载变化时,你可以根据实际情况调整限流阈值和策略,以保持服务的稳定性和可用性。
通过以上原理,Sentinel 能够帮助你在面临大流量时,保护你的服务免受雪崩效应的影响,确保服务的稳定和高可用。
漏桶算法(Leaky Bucket)和令牌桶算法(Token Bucket)都是常用的限流算法,它们各自有一定的特点和适用场景。下面是它们之间的主要区别:
- 出流速率: 漏桶算法:漏桶的出流速率是固定的,即桶内的水以恒定速率流出。这意味着即使在短时间内流入的流量较大,也无法增加流出的速率。因此,漏桶算法可以平滑突发流量,防止流量冲击。 令牌桶算法:令牌桶的出流速率取决于令牌的数量。令牌以恒定速率生成,但可以累积到一定数量。如果桶内有足够的令牌,那么请求可以以最大速率通过。这意味着令牌桶算法可以允许一定程度的突发流量。
- 请求处理: 漏桶算法:请求会先进入漏桶,如果漏桶已满,则会丢弃请求。对于需要处理的请求,它们会以固定速率从漏桶中流出。 令牌桶算法:请求到达令牌桶时,会尝试获取一个令牌。如果获取到令牌,请求被允许通过;如果没有令牌,则请求会被限制。
- 算法实现: 漏桶算法:实现相对简单,只需要一个固定容量的队列(代表漏桶)和一个固定速率的出队操作(代表水流出漏桶)。 令牌桶算法:实现相对复杂一些,需要一个令牌生成器以固定速率生成令牌,并将令牌放入令牌桶,同时需要对令牌桶的容量和令牌生成速率进行控制。
- 应用场景: 漏桶算法:适用于需要平滑流量、严格限制流出速率的场景,例如流量整形、带宽控制等。 令牌桶算法:适用于允许一定程度突发流量的场景,例如 API 限流、网络请求限制等。
总结:漏桶算法强调固定速率的出流控制,适合平滑流量和限制最大速率;令牌桶算法强调灵活的出流速率控制,适合允许一定程度突发流量的场景。具体选择哪种算法取决于你的业务需求
Sentinel 提供了多种限流策略,包括基于并发线程数的限制和基于响应时间的降级限制。下面我们分别来看这两种限制策略的实现原理:
- 基于并发线程数的限制: Sentinel 通过对资源的并发线程数进行限制,以控制同一时刻允许进入的请求数量。当资源的并发线程数超过设定的阈值时,Sentinel 会拒绝新的请求。实现原理如下:
a. 定义一个计数器(或计数信号量),用于记录当前并发线程数。 b. 当请求进入资源时,计数器加 1。 c. 检查计数器的值是否超过设定的阈值。如果超过阈值,则拒绝请求;否则,允许请求继续执行。 d. 当请求执行完成,离开资源时,计数器减 1。
通过这种方式,Sentinel 可以确保任何时刻资源的并发线程数都不超过设定的阈值,从而达到限流的目的。 - 基于响应时间的降级限制: Sentinel 提供了基于响应时间的降级策略,用于在资源出现性能问题时对其进行限制。当资源的平均响应时间超过设定的阈值时,Sentinel 会触发降级限制。实现原理如下:
a. 维护一个滑动窗口,用于记录资源的响应时间数据。滑动窗口可以按时间间隔分为多个桶,每个桶内存储一段时间内的响应时间数据。 b. 当请求执行完成,将响应时间添加到滑动窗口中。 c. 计算滑动窗口内的平均响应时间。如果平均响应时间超过设定的阈值,触发降级限制。 d. 在降级期间,Sentinel 会拒绝新的请求,或将请求转发至备用资源。 e. 当降级条件恢复正常,Sentinel 会自动解除降级限制。
通过这种方式,Sentinel 可以在资源出现性能问题时,自动触发降级限制,保护系统稳定性和资源可用性。
这两种限制策略可以根据业务需求进行组合使用,以实现更加灵活和高效的流量控制。同时,Sentinel 还提供了丰富的扩展接口,使得你可以根据需要实现自定义的限流策略。
服务接口保护有哪些方案?
(1)使用服务保护框架Sentinel,h,进行服务限流、熔断、降级
(2)黑白名单限制访问
什么是服务限流、服务熔断、服务降级、服务雪崩?
服务限流:在接口访问超过设置的阈值,走服务降级fallback方法
服务熔断:接口出现异常或者处理时间过长,直接熔断,走服务降级fallback方法
服务降级:在服务限流或者服务熔断的情况下,走服务降级fallback方法,一段时间内不再走业务逻辑方法
服务雪崩:默认的情况下,一个服务器只有一个线程池,在高并发情况下,一个接口访问次数过多,把线程池线程全部占用了,导致其他接口不可用,造成服务雪崩。黑客攻击同一个接口
解决方法:线程池隔离或者信号量隔离
线程池隔离就是每个接口设置一个线程池,这样占用内存非常大
信号量隔离就是每个接口设置一个阈值,超过阈值直接走服务降级