2012-03-06 34 views
7

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

+0

những gì về throttling trên máy chủ web (apache?) – Roger

+0

@Rogier dự án sẽ được triển khai trên heroku – RomanKapitonov

Trả lời

13

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

+0

mã sai! Thay đổi thành config.require "custom_failure" CelinHC

+0

cố định. Mọi thứ có vẻ ổn ngay bây giờ – RomanKapitonov

+0

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

2

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.

+0

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 0.2'. Có gì sai? – RomanKapitonov

Các vấn đề liên quan