Tôi đang tìm kiếm công cụ giới hạn tốc độ cho ứng dụng đường ray 3 của tôi. Tôi đã tìm thấy một số nhưng đó không phải là những gì tôi cần. Tôi đã tìm thấy đá quý rack-throttle và đá quý curbit. Có vẻ như rack-throttle hoạt động cho mỗi yêu cầu để gửi ứng dụng nhưng tôi cần giới hạn các yêu cầu chỉ cho một hành động. Curbit được cập nhật lần cuối hai năm trước. Bất cứ ai có thể cho tôi biết về bất kỳ động cơ hạn chế tốc độ khác mà tôi có thể sử dụng? Lưu ý rằng nó sẽ làm việc với bộ nhớ đệm.Tỷ lệ giới hạn cho bộ điều khiển đường ray
Trả lời
Vâng, cuối cùng giá ga là một giải pháp tốt.
Bạn có thể thực hiện theo cách sau. Bạn cần xác định giới hạn tùy chỉnh của mình. Có thể dựa trên một trong các giới hạn sau đây
Rack::Throttle::Limiter
Rack::Throttle::Interval
Rack::Throttle::Hourly
Rack::Throttle::Daily
Mọi thứ bạn cần làm là lấy từ một trong các lớp ở trên để xác định logic tùy chỉnh. Ví dụ:
class CustomLimiter < Rack::Throttle::Interval
def allowed?(request)
#custom logic here
end
end
Bạn nên đặt tệp này trong đường dẫn RAILS_ROOT/lib
. Sau đó, trong tệp application.rb
bạn nên chỉ định lớp nào sẽ sử dụng làm giới hạn. Ví dụ, nếu bạn muốn áp dụng giới hạn chỉ với một hành động mà bạn có thể làm điều đó theo cách sau:
#lib/custom_limiter.rb
class CustomLimiter < Rack::Throttle::Interval
def allowed?(request)
path_info = Rails.application.routes.recognize_path request.url rescue {}
if path_info[:controller] == "application" and path_info[:action] == "check_answer"
super
else
true
end
end
end
#config/application.rb
class Application < Rails::Application
...
#Set up rate limiting
config.require "custom_limiter"
config.middleware.use CustomLimiter, :min => 0.2
...
end
Bạn có thể cần phải thực hiện this xem xét
Hy vọng điều này sẽ hữu ích
UPD :
bạn có thể muốn xem giải pháp khác: rack-attack
mã sai! Thay đổi thành config.require "custom_failure"
–
CelinHC
cố định. Mọi thứ có vẻ ổn ngay bây giờ – RomanKapitonov
Cảm ơn bạn đã từng bước.Chỉ cần biết thêm một chút về thiết lập Bạn có đang sử dụng loại DB nào để lưu trữ bộ đếm không? – Eduardo
rack-throttle
thực hiện những gì bạn muốn. Phân lớp Limiter
và xác định phương thức #allowed?
của riêng bạn. Chỉ cần trả về true nếu yêu cầu không phải là hành động bạn muốn giới hạn và không tính đến giới hạn. Hãy xem daily.rb
. Xác định lại #cache_set
để nó không lưu những quảng cáo không khớp với tuyến đường bạn muốn giới hạn.
Tôi đã ghi đè nó, và đặt các tập tin trong thư mục lib và khởi động lại máy chủ nhưng nó không hoạt động. 'class CustomLimiter
những gì về throttling trên máy chủ web (apache?) – Roger
@Rogier dự án sẽ được triển khai trên heroku – RomanKapitonov