【问题标题】:How to add rate limiter in ruby on rails?如何在 ruby​​ on rails 中添加速率限制器?
【发布时间】:2020-05-13 04:41:56
【问题描述】:

在我的 ruby​​ on rails 应用程序中,我遇到了某些性能问题。在某些形式中,一次有超过 2500 个请求来自同一个 IP 地址。 所以我使用https://github.com/kickstarter/rack-attack添加速率限制器并跟踪来自IP地址的所有请求并通过将其存储在动态表中来跟踪它们。但是对于一定的时间间隔,如何在 5 秒内跟踪它们(即)有多少请求来自同一个 IP 地址。

【问题讨论】:

标签: ruby-on-rails ruby rackattack


【解决方案1】:

但是在一定的时间间隔内,如何在 5 秒内跟踪它们(即)有多少请求来自同一个 IP 地址。

要将每个 IP 的请求数限制为每 5 秒 10 个,您可以使用:

# config/initializers/rack_attack.rb

Rack::Attack.throttle('ip limit', limit: 10, period: 5) do |request|
  request.ip
end

如果单个 IP 在 5 秒内发出超过 10 个请求,则会收到“429 Too Many Requests”响应。

请注意,Rack Attack 使用“固定窗口”方法,在给定的持续时间内允许最多两倍的请求。例如,通过上述设置,您可以在一个窗口结束时发出 10 个请求,在下一个窗口开始时再发出 10 个请求,所有这些都在 5 秒(甚至更短)内完成。

【讨论】:

  • 在使用这些行时是否需要配置商店?:
  • 因为刷新页面时提示Unexpected error while processing request: wrong constant name ::Redis::Store。
  • Rack Attack 默认使用Rails.cache。规则和商店是相互独立的。
【解决方案2】:

您可以使用Rack::Attack.track 并将其配置为仅在发出一定数量的请求时才记录IP 地址。

# Supports optional limit and period, triggers the notification only when the 10 requests are made under 5 seconds from same Ip(configurable).

Rack::Attack.track("Log request", limit: 10, period: 5.seconds) do |req|
  req.ip
end

# Track it using ActiveSupport::Notification
ActiveSupport::Notifications.subscribe("track.rack_attack") do |name, start, finish, request_id, payload|
  req = payload[:request]
  Rails.logger.info "special_agent: #{req.path}"
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    相关资源
    最近更新 更多