开放API网关实践(三) —— 限流
如何设计实现一个轻量的开放API网关之限流
文章地址: https://blog.piaoruiqing.com/blog/2019/08/26/开放api网关实践三-限流/
前言
开发高并发系统时有多重系统保护手段, 如缓存、限流、降级等. 在网关层, 限流的应用比较广泛. 很多情况下我们可以认为网关上的限流与业务没有很强的关联(与系统的承载能力有关), 且各个子系统都有限流这种需求, 将部分限流功能放到网关会比较合适.
什么是限流
众所周知, 服务器、网站应用的处理能力是有上限的, 不论配置有多高总会有一个极限, 超过极限如果放任继续接收请求, 可能会发生不可控的后果.
举个栗子?, 节假日网上购票, 常常会遇到排队中
、系统繁忙请稍后再试
等提示, 这便是服务端对单位时间处理请求的数量进行了限制, 超出限制就会排队、降级甚至拒绝服务, 否则如果把系统搞崩了, 大家都买不到票了╮( ̄▽ ̄)╭.
我们先给出限流
的定义: 限流
是高并发系统保护保护手段之一, 在网关层的应用很广泛. 其目的是对并发请求进行限速或限制一个时间窗口内请求的数量, 一旦达到阈值就排队等待或降级甚至拒绝服务.
其最终目的是: 在扛不住过高并发的情况下做到有损服务
而不是不服务.
常用限流玩法
令牌桶
令牌桶算法, 是一个存放固定数量令牌的桶按照固定速率添加令牌. 如图:
- 按照固定速率向桶中添加令牌.
- 桶满时拒绝增加新令牌.
- 每次请求消耗一个令牌(也可根据数据包大小来消耗对应的令牌数).
- 当令牌不足时, 拒绝请求(或等待).
- 特点: 可以应对一定程度的突发.
举个现实生活中比较常见的例子来理解, 电影院售票, 每场电影所售出的票数是一定的, 如果来晚了(后面的请求)就没票了, 要么等待下一场(等待新的令牌发放), 要么不看了(被拒绝).
漏桶
漏桶是一个底部破洞的桶, 水可以匀速流出(这时候不考虑压强, 不要杠( ̄. ̄)), 所以与令牌桶不一样的是, 漏桶算法是匀速消费, 可以用来进