
获得徽章 9
- #青训营笔记创作活动#
1月13日 打卡day1
今日学习
常见限流方式之一:计数器
原理好理解,这里补充两种计数器的实现方式:互斥锁和原子操作
原子操作由**底层硬件**支持,而锁则由操作系统的**调度器**实现。锁应当用来保护一段逻辑,对于一个变量更新的保护,原子操作通常会更有效率,并且更能利用计算机多核的优势,如果要更新的是一个复合对象,则应当使用`atomic.Value`封装好的实现。
常见限流方式之二:滑动窗口
滑动窗口是将计数器的时间区间进一步划分多个格子,以格子为单位右移
计数器是只有一个格子的滑动窗口,格子越多,精度越高,但更新频率越快,计算负担越大,同时无法根本上解决临界点的问题
常见限流方式之三:漏桶
相当于给业务加了个缓冲区队列,同步执行时等待线程会阻塞;异步执行时业务由水桶代理执行,调用方只能知道请求被接受了,不知道请求具体什么时候执行
常见限流方式之四:令牌桶(Token Bucket)
按照一定生成速率在桶中生成令牌,请求到来时从桶里拿令牌,桶为空则阻塞或拒绝请求
令牌桶相对于漏桶的不同:
- 漏桶限制的是最大流出速率
- 令牌桶限制的是平均流入速率,并允许一定程度突发流量
Golang中还有一种限流方式:借助channel进行限流,有点像令牌桶
Golang官方也有自己的基于令牌桶的限流器,见`time/rate`包的`Limiter`类型展开评论点赞