如何限制一个API

限制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地址请求大于360,只需返回一个标题:

  429 - Too Many Requests 

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

有没有更优雅的高效解决scheme?

您可以尝试使用Redis, 限速模式很less

我绝对不会推荐使用MySQL来做这个事情 – 问题不在于你在那里突出显示的algorithm或者效率低下,而是写道。 随着卷的增加,你将开始进入多秒钟的写入。 我们使用REDIS作为另一个海报已经提到的存储 – 它具有primefaces增量/减量function,这正是你所需要的+它是非常快的(在内存中) – 你只需要pipe理超高容量分片(但超高是比MySQL高出许多个数量级)。 如果你不熟悉REDIS,另一个select就是在Memcached中执行 – 但是在操作层面还不是很好。

更进一步的select仍然是使用像3scale(http://www.3scale.net)这样有效地为你和其他东西(分析,密钥pipe理,开发人员文档等)做这一切。; 有一大堆语言的代码插件(https://support.3scale.net/libraries),并连接到基础架构。; 您也可以使用Varnish Libmod(https://github.com/3scale/libvmod-3scale/)并将其插入到API前面的Varnishcaching中。;

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

为了获得理想的性能,您可以运行一个轻量级的Web框架,该框架具有在内存数据库中pipe理日志的function,可以根据用户 调用的 IP用户服务来监视和loggingstream量数据。 更重要的select是你想要使用的数据存储。

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

redis.io高级键值存储

基于ehcache标准的caching,积极开发,维护和支持,作为兵马俑的专业开源项目

榛树开源内存数据网格快速执行和无缝弹性可伸缩性

VoltDB是一个内存运行数据库

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

这个系统意味着不需要数据库访问来检查速率限制,也不需要像MongoDB或Redis服务器那样的任何东西。 它确实假设你正在使用PHP与APC; 如果你不是,那么memcached可能会工作。