2012-03-06 127 views
7

我正在爲我的軌道3應用程序搜索限速引擎。我發現了一些,但那不是我需要的。我找到了機架節流寶石和寶石。看起來,機架節流閥適用於每個請求導軌應用程序,但我需要限制請求只有一個動作。 Curbit是兩年前更新的。任何人都可以告訴我關於我可以使用的任何其他限速引擎嗎?請注意,它應該與緩存一起工作。軌道控制器的速率限制

+0

如何在網絡服務器(apache?)扼殺 – Roger 2012-03-06 09:54:07

+0

@Rogier 該項目將部署在heroku – RomanKapitonov 2012-03-06 10:02:24

回答

13

那麼,最後機架油門是一個很好的解決方案。

您可以通過以下方式進行操作。您需要定義您的自定義限制器。它可以根據以下兩種限制器,你需要做的是從上面的一個類派生定義自定義邏輯

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

一切的。例如:

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

您應該將此文件放在RAILS_ROOT/lib路徑中。然後在application.rb文件中,您應該指定要用作限制器的類。例如,如果你想申請限制器只有一個動作,你能做到這一點的方式如下:

#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 

您可能需要採取this考慮

希望這將是有用的

UPD :

你可能想看看另一種解決方案:rack-attack

+0

錯誤的代碼!更改爲config.require "custom_failure" CelinHC 2012-03-29 15:08:38

+0

固定。一切似乎現在好了 – RomanKapitonov 2012-04-03 14:55:09

+0

感謝您的一步一步瞭解更多關於安裝。您是否使用什麼樣的數據庫來存儲計數器? – Eduardo 2014-01-02 11:12:46

2

rack-throttle做你想要的。子類Limiter並定義您自己的#allowed?方法。如果請求不是您想要限制的操作,並且不計入限制,請簡單地返回true。看看daily.rb。重新定義#cache_set,因此它不會保存那些與您想要限制的路由不匹配的路由。

+0

我已經覆蓋它,並將文件放在lib目錄並重新啓動服務器,但它不起作用。 'class CustomLimiter 0.2'。怎麼回事? – RomanKapitonov 2012-03-06 10:57:39