如何限制API的速率

时间:2012-01-08 03:09:18

标签: 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

如果ip-address请求大于360,只需返回标题为:

  429 - Too Many Requests

然后每小时回滚一次计数器小时请求。这似乎是一种非常低效的方法,因为我们必须在每个API请求上进行MySQL查询以增加计数器。此外,我们需要一个cron任务来每小时重置所有计数器。

是否有更优雅/更有效的解决方案?

5 个答案:

答案 0 :(得分:29)

您可以尝试使用Redis,there are few pattern for rate limiting

答案 1 :(得分: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 :(得分:11)

试试nginx。 通过在配置文件中编写简单的更改,可以轻松完成速率限制。而且,nginx很快。

答案 3 :(得分:6)

为了获得理想的性能,您可以运行轻量级Web框架,其中包含用于管理in-memory database日志的功能,用于监控和记录流量数据,基于 IP 用户用户调用的服务。更重要的选择是您要使用的数据存储。

最佳和最常用的免费选项是:

redis.io高级键值存储

ehcache基于标准的缓存,作为Terracotta的专业开源项目积极开发,维护和支持

hazelcast开源内存数据网格,可实现更快的执行速度和无缝的弹性可伸缩性

VoltDB内存操作数据库

答案 4 :(得分:2)

我目前正在调查这个问题。我目前的计划(请注意这是一个LAMP堆栈!)是使用APC的缓存功能来实现的。收到请求后,我会检查该IP是否存储在APC的缓存中。如果是,则检查它是否大于'X',其中'X'是每单位时间的最大请求数。如果不是,则为该IP创建缓存条目。

这个系统意味着不需要数据库访问来检查速率限制,它不依赖于MongoDB或Redis服务器之类的东西。它假设您使用PHP与APC;如果你不是,那么memcached可能会起作用。