2012-03-06 14 views
7

Poszukuję silnika z ograniczeniem prędkości dla mojej aplikacji rails 3. Znalazłem trochę, ale to nie jest to, czego potrzebuję. Znalazłem klejnot do szafy i klejnot. Wygląda na to, że tryb "rack-throttle" działa dla każdego żądania aplikacji rails, ale muszę ograniczyć żądania tylko do jednej akcji. Curbit został ostatnio zaktualizowany dwa lata temu. Czy ktoś może mi powiedzieć o innych silnikach ograniczających szybkość, z których mogę korzystać? Zauważ, że powinien działać z buforowaniem.Ograniczanie tempa dla kontrolerów szyn

+0

co dławienie na serwerze WWW (Apache?) – Roger

+0

@Rogier projekt zostanie wdrożony na Heroku – RomanKapitonov

Odpowiedz

13

No, wreszcie rack przepustnica jest dobrym rozwiązaniem.

Można zrobić to w następujący sposób. Musisz zdefiniować własny ogranicznik. Może ona być oparta na jednym z następujących ograniczników

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

wszystko trzeba zrobić, to wynika z jednej z powyższych klas zdefiniować niestandardową logikę. Na przykład:

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

Należy umieścić ten plik w ścieżce RAILS_ROOT/lib. Następnie w pliku application.rb należy określić klasę, która ma być używana jako ogranicznik. Na przykład, jeśli chcesz zastosować ogranicznik tylko do jednego działania można zrobić to w następujący sposób:

#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 

może trzeba wziąć this pod uwagę

nadzieję, że ta będzie przydatna

UPD :

może chcesz sprawdzić inne rozwiązanie: rack-attack

+0

zły kod! zmienić config.require "custom_failure" CelinHC

+0

stałe. Wszystko wydaje się być ok teraz – RomanKapitonov

+0

Dzięki za krokiem krok po. Wystarczy wiedzieć nieco więcej o konfiguracji. Czy korzystasz z jakiego rodzaju DB przechowywać liczniki? – Eduardo

2

rack-throttle robi to, co chcesz. Podklasa Limiter i określ własną metodę #allowed?. Po prostu zwróć true, jeśli żądanie nie jest akcją, której potrzebujesz, i nie licz do limitu. Spójrz na daily.rb. Zmień definicję #cache_set, aby nie zapisywać tych, które nie pasują do trasy, którą chcesz ograniczyć.

+0

Mam overrided go i umieścić plik w katalogu lib i ponownym uruchomieniu serwera, ale to nie działa. 'class CustomLimiter 0.2'. Co się stało? – RomanKapitonov