Ruby on Railsにレートリミッターを追加するにはどうすればよいですか?
概要
私の Ruby on Rails アプリケーションでは、特定のパフォーマンスの問題に直面しています。特定の形式では、一度に 2500 を超えるリクエストが同じ IP アドレスから送信されました。 そこで、https://github.com/kickstarter/rack-攻撃を使用してレートリミッターを追加し、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 Too Many Requests」という応答が返されます。
Rack Attack は、指定された期間中に最大 2 倍のリクエストを許可する「固定ウィンドウ」アプローチを使用していることに注意してください。たとえば、上記の設定を使用すると、1 つのウィンドウの終わりに 10 件のリクエストを作成し、次のウィンドウの開始時にさらに 10 件のリクエストをすべて 5 秒以内 (またはそれ未満) に行うことができます。