我正在使用Spring 3 + Spring MVC開發一個簡單的REST API。身份驗證將通過使用Spring Security的客戶端令牌通過OAuth 2.0或基本身份驗證完成。這仍在爭論中。所有連接將通過SSL連接強制。如何在Spring中基於客戶端令牌實現速率限制?
我一直在尋找有關如何實施速率限制的信息,但似乎並沒有很多信息。實施需要分佈,因爲它可以在多個Web服務器上工作。
例如,如果有三臺api服務器A,B,C和客戶端每秒限制爲5個請求,那麼發出6個請求的客戶端會發現請求C被拒絕並出現錯誤。
A recieves 3 requests \
B receives 2 requests | Executed in order, all requests from one client.
C receives 1 request /
它需要合作,開發基於包含在請求一個道理,作爲一個客戶端可以是代表了衆多網友的提出請求,並且每個用戶應該速率的限制,而不是服務器的IP地址。
設置將是HAProxy負載均衡器後面的多個(2-5)Web服務器。有一個Cassandra支持,並使用memcached。 Web服務器將在Jetty上運行。
一個潛在的解決方案可能是編寫一個定製的Spring Security過濾器,該過濾器提取該令牌並檢查在最近X秒內對它做了多少請求。這將允許我們爲不同的客戶做一些不同的費率限制。
有關如何完成的任何建議?有沒有現有的解決方案,還是必須編寫我自己的解決方案?我之前沒有做過很多網站基礎設施。
您正處於正確的軌道上,並且帶有過濾器的想法。既然你已經在使用memcached,它應該很簡單。 – sourcedelica 2012-04-17 03:45:30
它看起來像一個過濾器可能是要走的路。找到一篇有用的文章,介紹如何實現一個桶系統的時間間隔,這樣你就可以檢查最近X分鐘/秒的使用情況 - > http://chris6f.com/rate-limiting-with-redis。它使用redis,但原理應該與memcache或cassandra類似。 – 2012-04-18 23:42:06