高并发后端设计-限流篇
来源:互联网 发布:免费流量控制软件 编辑:程序博客网 时间:2024/05/17 09:07
系统在设计之初就会有一个预估容量,长时间超过系统能承受的TPS/QPS阈值,系统可能会被压垮,最终导致整个服务不够用。为了避免这种情况,我们就需要对接口请求进行限流。
限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待。
常见的限流模式有控制并发和控制速率,一个是限制并发的数量,一个是限制并发访问的速率,另外还可以限制单位时间窗口内的请求数量。
控制并发数量
属于一种较常见的限流手段,在实际应用中可以通过信号量机制(如Java中的Semaphore)来实现。
举个例子,我们对外提供一个服务接口,允许最大并发数为10,代码实现如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
在代码中,虽然有30个线程在执行,但是只允许10个并发的执行。Semaphore的构造方法Semaphore(int permits) 接受一个整型的数字,表示可用的许可证数量。Semaphore(10)表示允许10个线程获取许可证,也就是最大并发数是10。Semaphore的用法也很简单,首先线程使用Semaphore的acquire()获取一个许可证,使用完之后调用release()归还许可证,还可以用tryAcquire()方法尝试获取许可证。
控制访问速率
在我们的工程实践中,常见的是使用令牌桶算法来实现这种模式,其他如漏桶算法也可以实现控制速率,但在我们的工程实践中使用不多,这里不做介绍,读者请自行了解。
在Wikipedia上,令牌桶算法是这么描述的:
- 每过1/r秒桶中增加一个令牌。
- 桶中最多存放b个令牌,如果桶满了,新放入的令牌会被丢弃。
- 当一个n字节的数据包到达时,消耗n个令牌,然后发送该数据包。
- 如果桶中可用令牌小于n,则该数据包将被缓存或丢弃。
令牌桶控制的是一个时间窗口内通过的数据量,在API层面我们常说的QPS、TPS,正好是一个时间窗口内的请求量或者事务量,只不过时间窗口限定在1s罢了。以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。令牌桶的另外一个好处是可以方便的改变速度,一旦需要提高速率,则按需提高放入桶中的令牌的速率。
在我们的工程实践中,通常使用Guava中的Ratelimiter来实现控制速率,如我们不希望每秒的任务提交超过2个:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
控制单位时间窗口内请求数
某些场景下,我们想限制某个接口或服务 每秒/每分钟/每天 的请求次数或调用次数。例如限制服务每秒的调用次数为50,实现如下:
- 高并发后端设计-限流篇
- 高并发后端设计之《限流》
- 高并发限流
- 高并发之限流
- 高并发系统限流
- 高并发的限流特技
- 高并发系统限流特技
- 高并发系统限流特技2
- 高并发系统之限流特技
- 聊聊高并发系统之限流特技
- 使用lua语言做高并发限流
- 聊聊高并发系统之限流特技
- 聊聊高并发系统限流特技-2
- 高并发限流(一)——简介
- 聊聊高并发系统之限流特技
- 聊聊高并发系统之限流特技
- 高并发系统之限流特技
- 聊聊高并发系统之限流特技
- StringUtils源码
- Swift语言基础小习题(包含答案)-只适合菜鸟.
- (五)spring配置文件--使用外部属性文件
- Go实战--go语言操作PostgreSQL数据库(github.com/lib/pq)
- CF 873 B. Balanced Substring【map】
- 高并发后端设计-限流篇
- 前台传递Integer[] ids确保后台能准确接收
- What is the difference between arguments and parameters?
- iOS11 设置搜索栏取消按钮颜色
- ue4 character 物理测试
- background详解
- ASP.NET WebAPi之断点续传下载(下)
- struts2
- 内联函数