2012-01-08 203 views
45

限制API请求的最佳方式是什么?基本上,我们希望每小时限制用户360个API请求(每10秒一次请求)。想到什么是跟踪每个API请求和存储:速率限制如何限制API

ip-address   hourly-requests 
    1.2.3.4    77 
    2.3.4.5    34 
    3.4.5.6    124 

如果IP地址请求是大于360,只返回一个头:

429 - Too Many Requests 

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

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

+0

对于更具弹性的方法,您可能需要查看[令牌桶算法](https://en.wikipedia.org/wiki/Token_bucket)。 计数器应该放在一些存储器中,以提高性能。 – botchniaque 2015-07-02 10:02:36

回答

2

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

该系统意味着没有数据库访问需要检查的速率限制,它不依赖于像的MongoDB或Redis的服务器什么。它确实假设你正在使用PHP和APC;如果你不是,那么memcached可能会起作用。

10

我肯定不会推荐使用MySQL做这 - 问题是没有这么多读取或者你有突出的算法效率不高 - 但写道。随着卷的增加,您将开始进入多秒钟的写入。我们使用REDIS作为另一张海报已经提到的存储 - 它具有原子增量/减量功能,这正是您所需要的+它非常快速(在内存中) - 您只需要管理超高容量的分片(但超高是比MySQL高出许多个数量级)。如果您不熟悉REDIS,另一种选择是在Memcached中执行 - 但在操作级别上它不太好。

进一步的选择仍然是使用像3比例(http://www.3scale.net),它有效地做这一切都为您准备的其他的东西(分析,密钥管理,开发文档等)。有一大堆语言的代码插件(https://support.3scale.net/libraries),并连接到基础架构。您也可以使用Varnish Libmod(https://github.com/3scale/libvmod-3scale/)并将其插入API前面的Varnish缓存中。

4

对于性能的理想量,你可以运行与上in-memory database管理日志监控和记录业务数据功能的轻量的web框架,无论是基于IP用户服务用户调用。更重要的选择是你想要使用的数据存储。

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

redis.io先进的key-value存储

ehcache基于标准的高速缓存,积极开发,维护和兵马俑

支持作为一个专业的开源项目hazelcast开源内存数据网格,用于更快执行和无缝弹性可伸缩性

VoltDB内存中操作erational数据库

8

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