OpenResty限频限流
之前对系统限流这个话题有过一次讨论,之后有在实际工作中遇到一次应用,写一篇文章记录本次实践。
背景
目前在做的系统有提供Open API接入,即客户通过API Key接入使用系统功能。所允许接入的API根据功能种类不同所需系统开销有所差异,从技术角度希望对系统增加一些保护措施,避免用户接入使用过程有意或无意高频调用一些API对系统构成压力,从而影响整个系统稳定性。
限制主要考虑两个维度:
- 限频,限制单位时间内调用次数,关注调用速度
- 限流,限制时间窗口内调用次数,关注调用总量
如上描述,限频、限流本质是同一件事:“限制一定时间内的调用次数”,但此处特意使用两个不同的名词用于体现差异性(后文会多次提及):
- 单位时间,粒度小,常量,通常用秒描述
- 时间窗口,粒度大,变量,如一分钟、五分钟、十五分钟或一小时等
在目标系统中针对特定API(POST /api/order
),期望实现:“每秒调用不能超过20次,每分钟调用不能超过200次”,前者称之为限频,后者称为限流。
方案
限频限流可以选择在应用层实现,早期在一些项目中的确有借助Redis实践过,结论是只能满足前期需要,后期系统QPS过高时应用层与Redis的开销不容小觑。
当前项目的Open AP