如何在轨道上的红宝石中添加限速器?



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

但是

在一定的时间间隔内如何跟踪它们(即(在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 个请求过多"响应。

请注意,机架攻击使用"固定窗口"方法,该方法允许在给定持续时间内最多两倍的请求。例如,使用上述设置,您可以在一个窗口结束时发出 10 个请求,在下一个窗口开始时发出另外 10 个请求,所有这些都在 5 秒(甚至更短的时间内(完成。

您可以使用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

最新更新