これについてどうすればよいか誰にも分かりますか?オンラインで情報を見つけるのにかなり苦労しています。私が見つけた最高のものはcurbit it gemですが、それをアプリケーションごとに実装する方法しか考えられません。
2123 次
2 に答える
8
1) ウェブサーバー 2) ラックアプリケーションで処理できます。すべては必要なものに依存します。組み込みの nginx 機能を使用して、API リクエストを制限します。
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
limit_req zone=one burst=2;
もう 1 つの解決策は、ラック スロットルです。
これは、Rack アプリケーションへの受信 HTTP リクエストのレートを制限するためのロジックを提供する Rack ミドルウェアです。Rack::Throttle は、Ruby on Rails 3.0 や Sinatra を含む、Rack に基づく任意の Ruby Web フレームワークで使用できます。
于 2011-07-22T02:11:50.980 に答える
2
以下は、Redis とタイムスタンプを使用して実装する方法の例です。このモジュールを user.rb に含めると、呼び出すことができますuser.allowed_to?(:reveal_email)
# Lets you limit the number of actions a user can take per time period
# Keeps an integer timestamp with some buffer in the past and each action increments the timestamp
# If the counter exceeds Time.now the action is disallowed and the user must wait for some time to pass.
module UserRateLimiting
class RateLimit < Struct.new(:max, :per)
def minimum
Time.now.to_i - (step_size * max)
end
def step_size
seconds = case per
when :month then 18144000 # 60 * 60 * 24 * 7 * 30
when :week then 604800 # 60 * 60 * 24 * 7
when :day then 86400 # 60 * 60 * 24
when :hour then 3600 # 60 * 60
when :minute then 60
else raise 'invalid per param (day, hour, etc)'
end
seconds / max
end
end
LIMITS = {
:reveal_email => RateLimit.new(200, :day)
# add new rate limits here...
}
def allowed_to? action
inc_counter(action) < Time.now.to_i
end
private
def inc_counter action
rl = LIMITS[action]
raise "couldn't find that action" if rl.nil?
val = REDIS_COUNTERS.incrby redis_key(action), rl.step_size
if val < rl.minimum
val = REDIS_COUNTERS.set redis_key(action), rl.minimum
end
val.to_i
end
def redis_key action
"rate_limit_#{action}_for_user_#{self.id}"
end
end
于 2012-01-13T22:13:51.707 に答える