2012-03-06 10 views
7

Estoy buscando el motor de limitación de velocidad para mi aplicación de rieles 3. He encontrado algunos pero eso no es lo que necesito. He encontrado joya de rack-throttle y joya de curbit. Parece que el acelerador de cremallera funciona para cada solicitud a la aplicación de rieles, pero debo limitar las solicitudes solo a una acción. Curbit fue actualizado por última vez hace dos años. ¿Alguien puede decirme sobre cualquier otro motor de limitación de velocidad que pueda usar? Tenga en cuenta que debería funcionar con el almacenamiento en caché.Limitación de velocidad para controladores de rieles

+0

¿Qué pasa con la regulación en el servidor web (apache?) – Roger

+0

@Rogier El proyecto se implementará en heroku – RomanKapitonov

Respuesta

13

Bueno, finalmente el acelerador de cremallera es una buena solución.

Puede hacerlo de la siguiente manera. Debes definir tu limitador personalizado. Se puede basarse en cualquiera de los siguientes limitadores

Rack::Throttle::Limiter 
Rack::Throttle::Interval 
Rack::Throttle::Hourly 
Rack::Throttle::Daily 

todo lo que necesita hacer es derivar de una de las clases anteriores para definir la lógica personalizada. Por ejemplo:

class CustomLimiter < Rack::Throttle::Interval 
    def allowed?(request) 
    #custom logic here 
    end 
end 

se debería poner este archivo en la ruta RAILS_ROOT/lib. Luego, en el archivo application.rb, debe especificar qué clase usar como limitador. Por ejemplo, si desea aplicar limitador sólo a una acción que puede hacerlo de la siguiente manera:

#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 

Es posible que tenga que tomar this en consideración

Esperamos que esto sea útil

UPD :

es posible que desee echa un vistazo a otra solución: rack-attack

+0

código incorrecto! cambiar a config.require "custom_failure" CelinHC

+0

fijo. todo parece estar bien ahora – RomanKapitonov

+0

Gracias por el paso a paso. Solo para saber un poco más sobre la configuración. ¿Estás utilizando un tipo de DB para almacenar los contadores? – Eduardo

2

rack-throttle hace lo que quiere. Subclase Limiter y defina su propio método #allowed?. Simplemente devuelva true si la solicitud no es la acción que desea que sea el límite y no la cuente hasta el límite. Eche un vistazo al daily.rb. Redefina #cache_set para que no guarde los que no coincidan con la ruta que desea limitar.

+0

Lo he anulado, y colocé el archivo en el directorio lib y reinicié el servidor pero no funciona. 'class CustomLimiter 0.2'. ¿Qué ocurre? – RomanKapitonov

Cuestiones relacionadas