你好,我是马内斯瓦尔。
我正在建立git -lrc, 一个微AI代码审查员 运行在每个承诺。
Github上有免费的源头。
Star git-lrc帮助devs发现项目.
试着分享你的反馈 每个严肃的API最终都会叫你坐下来安静.
Hammer GitHub, Frede, 或 AWS 有点太急切了, 你的要求开始回放, 我总是觉得这很迷人,所以我们来造一个说不的东西。
到了这篇文章的末尾,我们将设计出一个速率限制器,当您将速率限制器放在真正的流量前时,它实际上会维持下去,我保证沿途只做一个合理的桶打.
一个限速器执行一个任务:它决定一个客户端在给定的时间窗口中允许提出多少请求.
它保护你的系统不被扁平,它使一个贪婪的用户不吃别人的午餐.
简单的想法。
令人惊讶地是辣味地执行.
让我们逐个地建立起来, 通过采访或设计文件,你实际上会解释。
首先,我们在建什么?
在写出一行之前,让我们就"好"的外观达成一致.
这是我的遗愿:可定义的限制。
类似"每个用户每分钟100个请求".
规则不应被硬编码,因为免费用户和溢价用户应该得到不同程度的痛苦.
诚实的拒绝。
当有人过去时,我们返回HTTP,并包括一些有用的信头,告诉他们他们有多少请求离开了,以及窗口何时重新发送。
没有谜 几乎没有时间。
这个检查是按每个请求进行的,所以必须快速进行.
我们瞄准P95的3米以下 如果你的限速器慢了,恭喜, 你创造了第二个瓶颈。
高度可用和共享。
多个服务器需要就相同的计数达成一致.
更多关于为什么"共享"这个词 做很多举重以后。
凉爽。
现在,让我们开始天真 并让现实打我们的脸几次。
尝试1:固定窗口计数器 最简单的是固定的窗户数 把时间切成一整分 给每个用户一个计数器.
每一个请求都使计数器一个接一个。
点击限制,被拒绝,并在下一个窗口启动时重置计数器.
清净.
可读取.
你可以跟橡皮鸭解释 我们把柜台放哪?
我们把柜台放哪? (这些旅行的人上) 你的第一个直觉可能是数据库 请不要。
我们会在数据库中增加一个字母 每一个请求, 这意味着我们建造的东西 保护我们的系统 现在悄悄地超载它。
这是"我带来了和平,自由, 和完整的桌子扫描。" 好吧,数据库被关闭。
在服务器上保留计数器怎么样?
烧快.
喜欢它。
但只有你有一个服务器 并且没有人运行一个服务器,它才会起作用 你一拉出,每个盒子都有自己的私人柜台。
一个狡猾的用户向Server A发送了100个请求,向Server B发送了100个请求,并且每分钟带着200个请求走开,而你的极限表示100个请求.
呜呼.
我们真正想要的就是 一个记忆快活的地方 在每个服务器上共享 这是雷迪斯。
它是一个记忆中的数据存储, 它把我们原子计数器原始的像, 它可以自动过期的密钥 所以窗口重置 自己。
这就是为什么Redis在白板上 基本上每个速率限制器的设计中出现。
到目前为止还不错 现在让我毁了它。
固定的窗户漏洞 没人警告你 固定的窗户 有个可怕的边缘箱子藏在缝合处 设定每分钟100个请求的限制 。
一个用户在一分钟的最后10秒点出100个请求,然后在下分钟的头10秒点出100个请求.
每个窗口在技术上都在限度内。
两者均为100或以下.
但放大后,你将在20秒内看到200个请求,这与"每分钟100个"的精神大相径庭.
这发生在每一个窗口边界, 一旦有人注意到这个模式,他们会绝对滥用它。
T级
