Jus*_*tin 55 api rate-limiting
限制API请求的最佳方法是什么?基本上,我们希望每小时将用户限制为360个API请求(每10秒一次请求).我们想到的是跟踪每个API请求并存储:
ip-address hourly-requests
1.2.3.4 77
2.3.4.5 34
3.4.5.6 124
Run Code Online (Sandbox Code Playgroud)
如果ip-address请求大于360,只需返回一个标头:
429 - Too Many Requests
Run Code Online (Sandbox Code Playgroud)
然后每小时回滚计数器每小时请求.这似乎是一种非常低效的方法,因为我们必须在每个API请求上进行MySQL查询以增加计数器.此外,我们需要一个cron任务来每小时重置所有计数器.
有更优雅/高效的解决方案吗?
小智 11
我绝对不会建议用MySQL做这个 - 问题不是那么多读取或者你在那里突出显示的算法效率低 - 但写道.随着数量的增加,你将开始进入多秒写入.我们使用REDIS作为存储作为已经提到的另一张海报 - 它具有原子递增/递减功能,这正是您所需要的+它非常快(在内存中) - 您只需管理超高容量的分片(但超高的是比MySQL高许多个数量级).如果你不熟悉REDIS,另一个选择是在Memcached中进行 - 但它在操作级别上并不是很好.
另一个选择仍然是使用像3scale(http://www.3scale.net)这样的东西,它可以有效地为你做所有这些+其他东西(分析,密钥管理,开发人员文档等).有一大堆语言的代码插件(https://support.3scale.net/libraries),这些插件连接到基础设施.您还可以使用Varnish Libmod(https://github.com/3scale/libvmod-3scale/)并将其插入API前面的Varnish缓存中.
小智 2
我目前也在调查这个问题。我当前的计划(注意这是使用 LAMP 堆栈!)是使用 APC 的缓存功能来实现这一点。收到请求后,我会检查该 IP 是否存储在 APC 的缓存中。如果是,则检查它是否大于“X”,其中“X”是每单位时间的最大请求数。如果不是,则为该 IP 创建缓存条目。
该系统意味着不需要访问数据库来检查速率限制,并且它不依赖于 MongoDB 或 Redis 服务器等任何东西。它确实假设您正在使用 PHP 和 APC;如果你不这样做,那么 memcached 可能会起作用。
| 归档时间: |
|
| 查看次数: |
43230 次 |
| 最近记录: |