限制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任务来每小时重置所有计数器.
有更优雅/高效的解决方案吗?
我启动了我的第一个开放式存储库项目EphChat,人们立即开始充斥它的请求.
Firebase是否有办法对安全规则中的限制请求进行评级?我假设有一种方法可以使用请求的时间和先前写入的数据的时间,但在文档中找不到有关如何执行此操作的任何内容.
目前的安全规则如下.
{
"rules": {
"rooms": {
"$RoomId": {
"connections": {
".read": true,
".write": "auth.username == newData.child('FBUserId').val()"
},
"messages": {
"$any": {
".write": "!newData.exists() || root.child('rooms').child(newData.child('RoomId').val()).child('connections').hasChild(newData.child('FBUserId').val())",
".validate": "newData.hasChildren(['RoomId','FBUserId','userName','userId','message']) && newData.child('message').val().length >= 1",
".read": "root.child('rooms').child(data.child('RoomId').val()).child('connections').hasChild(data.child('FBUserId').val())"
}
},
"poll": {
".write": "auth.username == newData.child('FBUserId').val()",
".read": true
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想对整个Rooms对象的db进行速率限制写入(和读取?),因此每秒只能生成1个请求(例如).
谢谢!
rate-limiting firebase firebase-security firebase-realtime-database
可能/部分重复:
我正在寻找为Web应用程序实现移动时间窗口速率限制算法的最佳方法,以减少垃圾邮件或暴力攻击.
使用的示例是"在过去5分钟内来自给定IP的最大失败登录尝试次数","最近N分钟内的最大((帖子/投票/等等)...").
我宁愿使用移动时间窗口算法,而不是每X分钟重新统计一次(比如twitter api).
这将是一个C#/ ASP.Net应用程序.
我正在使用GRequests和lxml 在Python 2.7.3中编写一个小脚本,这将允许我从各个网站收集一些可收集的卡片价格并进行比较.问题是其中一个网站限制了请求数量,如果我超过它,则发回HTTP错误429.
有没有办法在GRequestes中添加限制请求的数量,这样我就不会超过我指定的每秒请求数?另外 - 如果发生HTTP 429,我怎样才能使GRequestes在一段时间后重试?
在旁注 - 他们的限制是非常低的.每15秒就有8个请求.我在浏览器中多次破坏它只是刷新页面等待价格变化.
我使用INCR并EXPIRE实现速率限制(对于下面的示例,每分钟只允许5个请求):
if EXISTS counter
count = INCR counter
else
EXPIRE counter 60
count = INCR counter
if count > 5
print "Exceeded the limit"
Run Code Online (Sandbox Code Playgroud)
但是存在一个问题,即人们可以在最后一秒发送5个请求,在下一分钟发送5个其他请求,换句话说,在两秒钟内发出10个请求.
有没有更好的方法来避免这个问题?
更新:我刚才提出了一个想法:使用列表来实现它.
times = LLEN counter
if times < 5
LPUSH counter now()
else
time = LINDEX counter -1
if now() - time < 60
print "Exceeded the limit"
else
LPUSH counter now()
LTRIM counter 5
Run Code Online (Sandbox Code Playgroud)
这是一个好方法吗?
当尝试执行Amazon Web Services(AWS)Lambda函数(多次)时,我们看到了错误:
AWS Lambda TooManyRequestsException: Rate Exceeded
我们如何解决这个问题?
rate-limiting amazon-web-services node.js aws-lambda serverless
我正在使用Spring 3 + Spring MVC开发一个简单的REST API.使用Spring Security通过OAuth 2.0或基本身份验证与客户端令牌进行身份验证.这仍然存在争议.将强制所有连接通过SSL连接.
我一直在寻找有关如何实现速率限制的信息,但似乎并没有很多信息.实现需要分发,因为它适用于多个Web服务器.
例如,如果有三个api服务器A,B,C和客户端每秒限制为5个请求,则发出6个请求的客户端会发现对C的请求被拒绝并出现错误.
A recieves 3 requests \
B receives 2 requests | Executed in order, all requests from one client.
C receives 1 request /
Run Code Online (Sandbox Code Playgroud)
它需要基于请求中包含的令牌工作,因为一个客户端可能代表许多用户发出请求,并且每个用户应该是速率限制而不是服务器IP地址.
设置将是HAProxy负载均衡器后面的多个(2-5)Web服务器.有一个Cassandra支持,并使用memcached.Web服务器将在Jetty上运行.
一个可能的解决方案可能是编写一个自定义Spring Security过滤器,该过滤器提取令牌并检查在过去的X秒内使用它进行了多少次请求.这将允许我们为不同的客户做一些不同的速率限制.
有关如何做到的任何建议?有现成的解决方案还是我必须编写自己的解决方案?我以前没有做过很多网站基础设施.
我计划使用iTunes Search API获取应用相关信息 - http://www.apple.com/itunes/affiliates/resources/documentation/itunes-store-web-service-search-api.html
想知道API使用是否有任何预定义的速率/节流限制.在他们的Documentation/Stack/Google中找不到与此相关的任何信息.
有没有人有这方面的信息?
比方说,我让P进程在N台物理机上运行一些业务逻辑.例如,这些进程调用了一些Web服务S. 我想确保所有P进程组合的每秒服务S的调用不超过10次.
如何实施这样的解决方案?
Google Guava的速率限制器适用于在单个机箱上运行的进程,但不适用于分布式设置.
JAVA有哪些标准的,随时可用的解决方案?[可能基于zookeeper]
谢谢!
distributed-computing rate-limiting guava apache-zookeeper apache-curator
rate-limiting ×10
api ×2
http ×2
throttling ×2
algorithm ×1
asp.net ×1
aws-lambda ×1
c# ×1
firebase ×1
guava ×1
itunes-store ×1
java ×1
node.js ×1
oauth-2.0 ×1
python ×1
redis ×1
rest ×1
serverless ×1
spring ×1