2012-01-08 208 views
45

限制API請求的最佳方式是什麼?基本上,我們希望每小時限制用戶360個API請求(每10秒一次請求)。想到什麼是跟蹤每個API請求和存儲:速率限制如何限制API

ip-address   hourly-requests 
    1.2.3.4    77 
    2.3.4.5    34 
    3.4.5.6    124 

如果IP地址請求是大於360,只返回一個頭:

429 - Too Many Requests 

然後回滾櫃檯小時,請求每隔一小時。這似乎是一種非常低效的方法,因爲我們必須對每個API請求進行MySQL查詢以增加計數器。此外,我們需要一個cron任務來每隔一小時重置所有計數器。

是否有一個更優雅/有效的解決方案?

+0

對於更具彈性的方法,您可能需要查看[令牌桶算法](https://en.wikipedia.org/wiki/Token_bucket)。 計數器應該放在一些存儲器中,以提高性能。 – botchniaque 2015-07-02 10:02:36

回答

2

我目前正在調查這個問題爲好。我目前的計劃(注意這是一個LAMP堆棧!)是使用APC的緩存功能實現這一點。當收到請求時,我會檢查IP是否存儲在APC的緩存中。如果是,則檢查它是否大於'X',其中'X'是每單位時間的最大請求數。如果不是,則爲該IP創建緩存條目。

該系統意味着沒有數據庫訪問需要檢查的速率限制,它不依賴於像的MongoDB或Redis的服務器什麼。它確實假設你正在使用PHP和APC;如果你不是,那麼memcached可能會起作用。

10

我肯定不會推薦使用MySQL做這 - 問題是沒有這麼多讀取或者你有突出的算法效率不高 - 但寫道。隨着卷的增加,您將開始進入多秒鐘的寫入。我們使用REDIS作爲另一張海報已經提到的存儲 - 它具有原子增量/減量功能,這正是您所需要的+它非常快速(在內存中) - 您只需要管理超高容量的分片(但超高是比MySQL高出許多個數量級)。如果您不熟悉REDIS,另一種選擇是在Memcached中執行 - 但在操作級別上它不太好。

進一步的選擇仍然是使用像3比例(http://www.3scale.net),它有效地做這一切都爲您準備的其他的東西(分析,密鑰管理,開發文檔等)。有一大堆語言的代碼插件(https://support.3scale.net/libraries),並連接到基礎架構。您也可以使用Varnish Libmod(https://github.com/3scale/libvmod-3scale/)並將其插入API前面的Varnish緩存中。

4

對於性能的理想量,你可以運行與上in-memory database管理日誌監控和記錄業務數據功能的輕量的web框架,無論是基於IP用戶服務用戶調用。更重要的選擇是你想要使用的數據存儲。

最佳和最常用的免費選項:

redis.io先進的key-value存儲

ehcache基於標準的高速緩存,積極開發,維護和兵馬俑

支持作爲一個專業的開源項目hazelcast開源內存數據網格,用於更快執行和無縫彈性可伸縮性

VoltDB內存中操作erational數據庫

8

嘗試nginx。 通過在配置文件中編寫簡單的更改,可以輕鬆完成速率限制。而且,nginx很快。