如何處理速率限制

速率限制 是 API 提供者用來管理在特定時段內對其服務提出要求數目的常見技術。 API 提供者會使用速率限制來確保其服務仍可供所有使用者使用及回應,以及防止濫用或過度使用服務。

當您在應用程式中使用雲端 API 時,您應該瞭解其速率限制。 下列技術可協助您處理應用程式中的速率限制:

  • 瞭解速率限制。 請檢查您所使用的 API 文件以瞭解其調用限制。 速率限制可能取決於您使用的 API 提供者或服務方案。 例如,某些 API 可能會有不同的免費和付費方案費率限制。
  • 使用速率限制資訊。 使用速率限制的 API 通常會在回應標頭中傳達目前的限制。 例如,標頭 RateLimit-Remaining 會指出目前視窗中保留的要求數目。 如果您收到此標頭設定為 0 的回應,您知道您已達到速率限制,而且應該在傳送另一個要求之前等候下一個視窗。 RateLimit-Reset 標頭表示速率限制重設的時間。 標頭名稱與格式會因 API 而異:例如 GitHub 使用 x-ratelimit-remaining 和 x-ratelimit-reset 以 UTC 紀元秒計。 有些 API 只有在達到門檻後才會傳送標頭。 例如,當您的要求剩餘 10 個% 時。
  • 優化 API 使用量。 有些服務會根據其複雜性,將不同的成本指派給不同的要求。 例如,某些 API 可能會針對傳回更多數據的要求收取更多費用。 若要降低應用程式的成本,請只擷取您所需的數據,以優化 API 使用量。 如果 API 支援批次要求,請使用批次要求。 其可協助您減少處理回應所需的資源數目,並維持在速率限制內。
  • 實作本地速率限制器。 在應用程式本身內實作速率限制器,以限制在特定時段內對 API 提出的要求數目。 您可以使用令牌桶或漏桶演算法等技術來執行此作業,讓應用程式可在每個時段提出許多要求。 進一步的要求會被排入佇列或被捨棄。
  • 避免超過速率限制。 當你超過速率限制時,API 會對你的請求進行節流,通常會使用 HTTP 429 Too Many Requests 狀態碼。 節流對應用程式吞吐量的影響比速率限制還大。 利用速率限制回應標頭中的資訊,保持在速率範圍內,避免遭到節流。

藉由使用這些技術,您可以建置可復原速率限制的應用程式,即使 API 負載過重,仍可繼續運作。 然後測試它們是否確實會觸發速率限制,因為在開發過程中很少會達到速率上限。

如何測試你的速率限制處理

Approach 你發現的 你錯過的內容
等待正式環境 實際速率限制 在使用者觸發之前,一切皆如此
在測試中模擬 API,或讓你的程式代理寫出模擬 你的程式碼是否能讀取你模擬的標頭 API 的真實標頭名稱、格式和重置行為,以及你 SDK 的重試政策。 你的應用程式也需要一個只供測試使用的開關來連到模擬端點。
一直呼叫真正的 API,直到觸及上限 實際行為 你無法隨時觸及限制,會用掉真正的配額,有些限制只會在一小時後重置
攔截你應用程式的真實流量並模擬限制條件 真實網址、你選擇的限制和時間範圍,以及 API 本身的標頭 你的程式碼獨立呈現。 那個就留給單元測試吧。

在你的應用程式上試試看

Dev Proxy 會計算你的應用程式對你所選擇之 API 發出的請求數,並在回應中加入速率限制標頭;當你的應用程式超出限制時,會以 429 回應,而應用程式則持續呼叫真實網址。 你可以選擇限制和時間範圍,所以你可以在一分鐘內達到限制,而不是一小時。

用於 GitHub,下載預設並使用該預設啟動 Dev Proxy:

devproxy config get github-rate-limiting
devproxy --config-file "~dataFolder/configs/github-rate-limiting/.devproxy/devproxyrc.json"

對於 Microsoft Graph 呼叫 OneDrive 和 SharePoint(/drive、/shares、/sites),請使用 microsoft-graph-rate-limiting 預設集。 要安裝 Dev Proxy,請參見 設定 Dev Proxy。

後續步驟