-
高可用之限流-07-token bucket 令牌桶算法
令牌桶算法
令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。
典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。
令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。
从原理上看,令牌桶算法和漏桶算...
2018-12-23 05:55:13 |
Distributed
-
高可用之限流-06-slide window 滑动窗口 sentinel 源码
sentinel 构建滑动时间窗口
上文介绍过通过调用LeadArray的currentWindow方法返回时间窗口,下面来仔细分析。
public WindowWrap<T> currentWindow() {
//参数是当前时间
return currentWindow(TimeUtil.currentTimeMillis());
}
public Wi...
2018-12-23 05:55:13 |
Distributed
-
高可用之限流-05-slide window 滑动窗口
滑动日志-Sliding Log
滑动日志算法,利用记录下来的用户的请求时间,请求数,当该用户的一个新的请求进来时,比较这个用户在这个窗口内的请求数是否超过了限定值,超过的话就拒绝这个请求。
优点:
避免了固定窗口算法在窗口边界可能出现的两倍流量问题
由于是针对每个用户进行统计的,不会引发惊群效应
缺点:
需要保存大量的请...
2018-12-23 05:55:13 |
Distributed
-
高可用之限流-04-fixed window 固定窗口
固定窗口
计数器的方案比较简单。比如限制1秒钟内请求数最多为10个,每当进来一个请求,则计数器+1。
当计数器达到上限时,则触发限流。
时间每经过1秒,则重置计数器。
核心代码
重置计数器可以通过 loop 循环,也可以通过 CountDownLatch 达到类似的效果。
此处演示一下 CountDownLatch 的实现版本
public class LimitFixedWi...
2018-12-23 05:55:13 |
Distributed
-
高可用之限流-03-Semaphore 信号量做限流
主流的限流方式
目前主要有以下几种限流方式:
信号量
计数器
滑动窗口
漏桶算法
令牌桶算法
分布式限流
信号量
信号量实际上就是限制系统的并发量,来达到限流的目的。
常见的用法是:创建Semaphore,指定permit的数量。
在方法开始时,调用 Sem...
2018-12-23 05:55:13 |
Distributed
-
高可用之限流-02-如何设计限流框架
序言
如何设计一款限流框架?
核心组件
锁
这个锁可以是对象锁
全局锁
分布式锁
令牌
限制瞬时并发数
限制时间窗最大请求数
令牌桶
限流的维度
可以 1s 内
1min 内
1h 内
1D 内
这里应该是一个责任链,全部满足才能放行。
限制类型
次数
频率
编写方式
声明式
注解式
个人收获
服务平台的思想
所有的服务都可以使用类似的策略。...
2018-12-23 05:55:13 |
Distributed
-
高可用之限流-01-入门介绍
背景
在如今的互联网已经作为社会基础设施的大环境下,上面的这个场景其实离我们并不是那么远,同时也会显得没那么极端。
例如,层出不穷的营销玩法,一个接着一个的社会热点,以及互联网冰山之下的黑产、刷子的蓬勃发展,更加使得这个场景变的那么的需要去考虑、去顾忌。
因为随时都有可能会涌入超出你预期的流量,然后压垮你的系统。
那么限流的作用就很显而易见了:只要系统没宕机,系统只是因为资源不够,而...
2018-12-23 05:55:13 |
Distributed
-
高可用之降级
降级
概念
「降级」工作,目的是为了腾出更多资源给核心程序使用,以最大化保证核心业务的可用性,因此就必然需要对非核心业务执行一些降级处理。
降级的目的用一句话概括就是:将有限的资源效益最大化。
例子
什么样才是效益最大化呢?就像下面这个例子:
有3个东西要买,一个3000的A、一个700的B、一个1200的C,对个人的重要程度A>B>C。
但此时,手里只有3000块...
2018-12-23 05:55:13 |
Distributed