2011-12-25 21 views
4

實現以下速率限制用例的最佳機制是什麼?像Token Bucket這樣的常用算法可以使用,但我希望實現位於memcached的上下文中。感謝這方面的幫助。給定場景的速率限制算法建議

  • 一天只允許來自客戶ABC的100個呼叫。
  • 只允許在一個小時內向客戶ABC撥打50個API。
  • 只允許客戶在任何用戶使用ABC的情況下在一個小時內收到5個API調用請求。

回答

0

當達到此限制時,您希望發生什麼?你可以阻止服務或重定向到一個回來的明天頁面,但這很醜陋。

您可以減慢處理請求的速率,但這對於每秒幾個速率更有用。例如客戶ABC限制爲每秒100次或每分鐘。對於您談論的非常低的費率,客戶會超時並認爲服務器已經死機。

+0

這篇文章中的數字就是例子。另外,我想阻止該服務。 – 2011-12-25 09:08:52

+0

在這個原因中,增加計數器,如果他們達到極限,返回一個頁面,表明用戶明天應該回來。 – 2011-12-25 09:14:25

0

如果我正確理解每個API請求都帶有userID和customer。每個客戶可以有多個用戶ID。您想要在客戶和用戶ID級別對費率進行限制。

您將需要使用多個鍵ABC_day,ABC_hour,ABC_userID1_hour,ABC_userID2_hour等來計算這些活動發生的次數。這種方法的問題是何時重置這些計數器。由於memcached僅支持數值上的增量運算符,因此我們需要將此信息編碼到密鑰本身中。我們可以使用ABC_2012_02_28作爲日費率限制的關鍵。在你的代碼中,只需使用當前日期創建它們並將其增加即可。當一天更改時,您的代碼將查找不存在的ABC_2012_02_29,併爲您提供創建新密鑰的機會。

替代方案是cacheismo。它是一個像memcached一樣的緩存,並支持memcached協議,並提供「緩存」腳本。您可以實現您自己的「限速」對象,而不是創建如此多的按鍵,它將爲您完成所有簿記。 請參閱http://chakpak.blogspot.in/2011/09/rate-limitingquota-with-cacheismo.html瞭解速率限制的示例實施。你可以從這裏得到它。 https://github.com/iamrohit/cacheismo