速率限制如何限制API
限制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任务来每隔一小时重置所有计数器。
是否有一个更优雅/有效的解决方案?
我目前正在调查这个问题为好。我目前的计划(注意这是一个LAMP堆栈!)是使用APC的缓存功能实现这一点。当收到请求时,我会检查IP是否存储在APC的缓存中。如果是,则检查它是否大于'X',其中'X'是每单位时间的最大请求数。如果不是,则为该IP创建缓存条目。
该系统意味着没有数据库访问需要检查的速率限制,它不依赖于像的MongoDB或Redis的服务器什么。它确实假设你正在使用PHP和APC;如果你不是,那么memcached可能会起作用。
我肯定不会推荐使用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缓存中。
对于性能的理想量,你可以运行与上in-memory database管理日志监控和记录业务数据功能的轻量的web框架,无论是基于IP或用户或服务用户调用。更重要的选择是你想要使用的数据存储。
最佳和最常用的免费选项:
redis.io先进的key-value存储
ehcache基于标准的高速缓存,积极开发,维护和兵马俑
支持作为一个专业的开源项目hazelcast开源内存数据网格,用于更快执行和无缝弹性可伸缩性
VoltDB内存中操作erational数据库
尝试nginx。 通过在配置文件中编写简单的更改,可以轻松完成速率限制。而且,nginx很快。
对于更具弹性的方法,您可能需要查看[令牌桶算法](https://en.wikipedia.org/wiki/Token_bucket)。 计数器应该放在一些存储器中,以提高性能。 – botchniaque 2015-07-02 10:02:36