開發與網路

Rate Limit 速率限制是什麼?被擋下來的時候該怎麼辦

Rate Limit 速率限制,是服務端規定單位時間內最多允許多少次請求或多少用量,超過就回傳被限流的錯誤。它的目的是保護服務穩定、避免單一使用者吃掉全部資源。遇到時正確做法是等待後重試並逐次拉長間隔,而不是立刻重打。
Rate Limit 速率限制是什麼?被擋下來的時候該怎麼辦:文章重點卡

Rate Limit 速率限制是什麼?被擋下來的時候該怎麼辦

自動化流程跑到一半突然全部失敗,錯誤訊息看起來像斷線。查了半天才發現是被限流了。

速率限制不是故障,是設計。搞懂它的規則與應對方式,你的自動化才會從「偶爾爆掉」變成「穩定跑完」。

你將學到什麼

定義

服務端對單位時間內的請求次數或用量設上限,超過就先擋下來。

白話比喻

像餐廳的出餐量。不是不做你的單,是請你稍等一下再點。

跟誰容易搞混

跟吞吐量方向相反。吞吐量是你實際跑得多快,速率限制是別人允許你跑多快。

定義

Rate Limit 速率限制,是服務端對你設下的用量上限:單位時間內最多幾次請求、最多處理多少內容量。超過上限,請求就會被擋下來,回傳一個表示「請求太多」的錯誤。

常見的計算方式有兩類:一類看請求次數,例如每分鐘幾次;另一類看用量,例如每分鐘處理多少內容。很多服務兩種同時計算,任一項超過就擋。

額度通常綁在你的帳號或金鑰上,並依方案等級不同。同一支API Key 被多個程式共用,額度是一起算的,這也是很多人莫名其妙被擋的原因。

白話比喻

像熱門餐廳的出餐節奏。廚房一次只能出這麼多,不是不做你的單,是請你稍等再點。你如果一直催單,只會讓整個廚房更亂。

所以被擋下來的正確反應是等,不是重打。收到錯誤立刻重打,等於在櫃檯前面一直按鈴,通常會被擋得更久。

被擋下來時怎麼做才對?

情況錯誤做法正確做法
剛被限流立刻重打同一個請求等待後再重試,間隔逐次拉長
整批任務被擋整批重跑一次只補跑失敗的部分,並降低併發數
常態性超量一直重試硬闖改走批次、加快取,或申請提高額度
多個程式共用金鑰各自全速呼叫集中做流量控制,分配各自的配額

實際用例

最常見的踩雷情境是資料批次處理。一個迴圈跑三千筆,程式全速呼叫,前面幾百筆正常,之後整批失敗。表面看起來像服務不穩,其實是自己打太快。

解法有三層。第一層在程式裡限制併發數與呼叫頻率;第二層對失敗的請求做指數退避重試;第三層把不急的工作改走批次推論或排到離峰時段。三層做完,穩定度會完全不同。

另外提醒一件事:限流的錯誤訊息常常長得像網路問題。看到大量失敗時,先確認回應的狀態碼是不是限流,可以省下很多亂查的時間。

常見誤解第一個誤解是把限流當成服務故障,於是去查網路與憑證,方向完全錯。第二個是以為升級方案就一勞永逸,額度提高之後只要程式仍然全速呼叫,一樣會撞上,流量控制該做還是要做。
本文源起本文為酒Ann 的 AI 名詞彙編系列,用白話把常見名詞一次講清楚。歡迎追蹤 酒Ann 的 Facebook

延伸學習

把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

為什麼服務要設速率限制?
三個理由:保護後端不被瞬間流量打垮、確保資源在所有使用者之間公平分配、避免異常程式或攻擊行為造成連鎖故障。對服務商來說,這是穩定性的基本設計。
被限流時該怎麼處理?
先等待再重試,而且每次重試把間隔拉長,這叫指數退避。同時看回應裡有沒有告訴你要等多久,有的話照著等。絕對不要收到錯誤就立刻重打,那只會被擋得更久。
怎麼避免一直撞到上限?
四個做法:在自己的程式裡先做流量控制,不要一次全開;把不急的工作改走批次或排到離峰時段;快取重複的請求結果;用量真的需要更高就申請提高額度。