【发布时间】:2010-03-07 16:42:07
【问题描述】:
尝试在 Google 上寻找一个 Rails 插件,该插件将允许限制特定资源消耗的请求数量。 Django 的Piston 有一些开源代码。 Rails 是否有现成可用的东西,或者可以安全地假设看看 Piston 是如何做到的并将其作为 Rails 插件移植是可以工作的?
【问题讨论】:
标签: ruby-on-rails ruby
尝试在 Google 上寻找一个 Rails 插件,该插件将允许限制特定资源消耗的请求数量。 Django 的Piston 有一些开源代码。 Rails 是否有现成可用的东西,或者可以安全地假设看看 Piston 是如何做到的并将其作为 Rails 插件移植是可以工作的?
【问题讨论】:
标签: ruby-on-rails ruby
这里有一些机架中间件可以完成您所追求的:http://github.com/dambalah/api-throttling
这里有一篇关于该中间件开发的博客文章:http://blog.messagepub.com/2009/05/05/how-to-rack-middleware-for-api-throttling/
【讨论】:
Rack::Defense 是一个用于请求限制和过滤的机架中间件。它易于设置,占用空间小,并且只有两个依赖项(机架和 redis)。您几乎可以根据任何条件进行过滤:ip、api 令牌、用户名等。
下面是一个示例,您将如何限制路径 /login 的 POST 请求,每个 IP 的最大请求率为每分钟 20 个请求:
Rack::Defense.setup do |config|
config.throttle('login', 20, 60 * 1000) do |req|
req.ip if req.path == '/login' && req.post?
end
end
另一个关于如何限制路径 /api/* 的 GET 请求的示例,每个 API 令牌的最大请求率为每秒 50 个请求:
Rack::Defense.setup do |config|
config.throttle('api', 50, 1000) do |req|
req.env['HTTP_AUTHORIZATION'] if %r{^/api/} =~ req.path
end
end
声明:我是 Rack::Defense gem 维护者。
【讨论】:
有一个 SO thread here 关于为什么您可能希望在应用程序之外进行速率限制。至少值得深思。我自己也在寻找这个解决方案,我是否想在应用层做这个还悬而未决。
【讨论】: