指南

什麼是速率限制(Rate Limiting)?應用程式建構者嘅白話指南

速率限制係一條規則,限制某人喺指定時間內可以向系統提出幾多次請求,例如每分鐘最多 5 次登入嘗試,或者每小時最多 100 次 API 調用。一旦達到上限,之後嘅請求會被拒絕(通常返回錯誤碼 429 Too Many Requests),直至時間窗口重置為止。佢可以保護應用程式免受濫用、防止單一大量使用者拖慢所有人嘅速度,亦可以阻止成本失控。

你會從兩方面接觸速率限制:你調用嘅服務會限制你,而你自己嘅應用程式亦應該限制佢嘅用戶。

用 AI 建造嘢時,點解速率限制重要

用 AI 建造嘅應用程式,經常會連接到收費服務,例如 AI 模型、電郵、短訊、地圖,而每次調用都要花錢。咁樣,速率限制同時係保安功能同預算功能。

  • 成本控制。 如果你嘅應用程式有一個「問 AI」嘅輸入框,但冇限制,一個機械人可以喺一晚之間送出數千次請求,每一次你都要付費。
  • 保安。 如果登入表格冇限制,攻擊者可以對一個帳戶嘗試數千個密碼。設定每分鐘只準幾次嘗試,就令呢種攻擊變得唔切實際。
  • 保持運作。 一個行為異常嘅腳本(有時係你自己嘅程式碼卡喺迴圈入面)就可能令資料庫超負荷,令應用程式停擺。
  • 尊重其他服務嘅限制。 當你嘅應用程式太頻密咁調用外部 API,係你會收到 429 錯誤,而用戶嘅功能就會壞咗。

AI 建構器會建造你要求嘅嘢。如果你冇提及限制,佢哋通常就唔會加入。

日常生活比喻

諗一諗咖啡店嘅免費續杯政策:「每位顧客每次到店可免費續杯一次。」

  • 佢並唔阻止任何人享用咖啡。
  • 佢阻止咗一個人成日企喺櫃檯,為成間辦公室續杯。
  • 當有人要求第四次續杯,店員會禮貌咁講「而家唔得」,呢個就係 429。

好嘅速率限制,對正常顧客嚟講係睇唔到嘅,只會被做奇怪嘢嘅人察覺。

速率限制點運作

一個速率限制器需要三樣嘢:

部分回答咩問題例子
邊個計算邊個嘅請求?每個用戶帳戶、每個 IP 位址、每條 API 金鑰
幾多限額係幾多?5、60、1,000 次請求
以咩時間計喺邊個時間窗口之內?每秒、每分鐘、每小時、每日

當請求到達,應用程式會檢查嗰個「邊個」嘅計數。未超過限額:請求通過,計數加一。超過限額:請求被拒絕。

常見嘅計數方式有以下幾種:

方法運作方式取捨
固定窗口計數按鐘錶重置,例如每分鐘正點重置簡單,但喺兩個窗口交接處可能容許一陣爆發式請求
滑動窗口睇由而家開始計嘅過去 60 秒較平滑,計算上稍為複雜
令牌桶(Token bucket)每位用戶有一個桶,以穩定速度注入;每次請求消耗一個令牌容許短時間爆發,同時維持平均速率穩定

計數需要儲存喺一個快速而且可以共用嘅地方。如果只係一部細型伺服器,放喺記憶體就得。但當應用程式跑喺多部機器上,計數器通常要放喺 Redis 之類嘅共用儲存,或者資料庫入面;否則每部機器各自計數,真正嘅限額就會變成原本嘅好幾倍。

被限制嘅回應係點樣嘅

當請求超過限額,設計良好嘅 API 會回應:

  • 狀態碼 429 Too Many Requests。
  • 通常會有 Retry-After 標頭,說明要等幾多秒。
  • 有時會有標頭顯示你嘅限額,以及呢個窗口內仲剩幾多次請求(名稱視乎供應商而定)。

你嘅應用程式收到 429 時,應該等一陣再試,最好採用指數退避(exponential backoff),即每次失敗後等待嘅時間愈來愈長(1 秒、然後 2 秒、然後 4 秒),而唔係不斷狂撳服務。

實例:AI 寫作助手

假設你建造咗一個應用程式,用戶貼上文字,然後由 AI 改寫。

冇限制: 有人寫咗一個腳本,一晚之間送出 20,000 次請求。你嘅 AI 供應商帳單急升,你嘅帳戶又撞到供應商自己嘅速率限制,結果真正嘅用戶成個早上都見到錯誤。

有合理嘅限制:

  1. 每位已登入用戶: 免費計劃每小時 30 次改寫,付費計劃 300 次。超過限額時,用戶會見到:「你已達到呢個小時嘅上限。請 12 分鐘後再試,或者升級。」
  2. 註冊表格上每個 IP 位址: 每小時最多 5 次註冊,防止機械人建立數千個免費帳戶去繞過每位用戶嘅限制。
  3. 喺 AI 供應商嘅儀表板設定消費上限,作為所有其他方法都失效時嘅最後防線。
  4. 處理供應商嘅限制: 如果 AI 供應商返回 429,你嘅伺服器會等待並重試一兩次,然後顯示友善嘅「而家繁忙,請稍後再試」訊息。

限制應該喺伺服器上檢查。只存在於瀏覽器嘅限制(例如撳咗 30 次之後就停用按鈕)可以俾任何直接調用你 API 嘅人繞過。

主要名詞

名詞意思
速率限制(Rate limit)一個時間窗口內允許嘅最大請求數。
配額(Quota)較大嘅額度,通常以日或者月計,有時同付費計劃掛鈎。
429「請求過多」嘅 HTTP 狀態碼。
Retry-After一個回應標頭,說明再試之前要等幾耐。
節流(Throttling)放慢或者拒絕超過限額嘅請求。常被當作同義詞使用。
指數退避(Exponential backoff)每次重試之間等待時間逐步加長。
爆發(Burst)短時間內大量請求同時湧入。
暴力破解攻擊(Brute-force attack)嘗試大量密碼或驗證碼,直至其中一個成功。

常見誤解

  • 「速率限制只係大型應用程式先需要。」 細型應用程式同樣係目標,因為機械人會掃描整個互聯網,尋找開放嘅表格同 AI 端點。濫用嘅成本唔取決於你嘅規模。
  • 「隱藏按鈕就夠。」 瀏覽器端嘅限制只係一種禮貌,唔係保護。真正嘅限制必須喺伺服器上執行。
  • 「每個 IP 嘅限制一定公平。」 好多人可能共用同一個 IP 位址,例如一間辦公室、一間學校,或者同一個流動網絡。用戶登入之後,按用戶設定限制會更公平。
  • 「429 即係服務壞咗。」 其實即係你調用得太頻密。檢查你嘅程式碼有冇迴圈,並且將唔常變動嘅結果快取起嚟,參閱什麼係快取。
  • 「速率限制可以取代消費上限。」 兩者都要用。應用程式入面嘅限制可能有錯誤;供應商嘅消費上限就係你嘅後備保障。

要問你嘅 AI 建構器嘅嘢

  • 「為登入、註冊、重設密碼同 AI 端點加入伺服器端嘅速率限制,並建議合理嘅限額。」
  • 「限制每位已登入用戶每小時最多 [N] 次 AI 請求;觸發限制時,顯示清楚嘅訊息並附上需要等候嘅時間。」
  • 「外部 API 返回 429 時,以指數退避最多重試 3 次,然後顯示友善嘅錯誤訊息。」
  • 「速率限制嘅計數器儲存喺邊度?如果應用程式跑喺多部機器上,佢哋仲會正常運作嗎?」
  • 「每當用戶或 IP 觸發限制時都記錄下來,等我可以發現濫用行為。」
  • 「呢個應用程式會調用邊啲外部服務?佢哋嘅速率限制係幾多?」

Mythex 中嘅速率限制

Mythex 嘅文件對 AI 功能嘅呢點講得好直接:你建造嘅應用程式入面嘅速率限制、安全同成本控制,都由你自己設計,詳情可以睇建構 AI 應用程式。你可以喺要求功能嗰一條訊息入面,同時要求代理加入限制。喺 Pro 計劃下,流量大嗰陣,已發布嘅服務最多可以跑喺三部機器上(參閱託管限制),所以要求計數器儲存喺資料庫,而唔係某一部伺服器嘅記憶體入面。

相關閱讀:什麼係 API、點樣使用 LLM API,以及 AI 建造應用程式嘅保安清單。

常見問題

簡單嚟講,什麼係速率限制?

速率限制係一條規則,限制某個用戶、裝置或者應用程式喺指定時段內最多可以提出幾多次請求,例如每分鐘最多 5 次登入嘗試,或者每小時最多 100 次 API 調用。超過限額嘅請求會被拒絕,直至時段重置為止。

429 Too Many Requests 錯誤係咩意思?

HTTP 狀態碼 429 表示你喺太短時間內發出太多請求,觸發咗速率限制。回應通常會包括 Retry-After 標頭,說明要等幾耐。解決方法係放慢速度、等一段時間後再試,或者減少你嘅應用程式呼叫該服務嘅次數。

我嘅 AI 應用程式點解需要速率限制?

每次 AI 請求都會以 token 計算費用。如果冇限制,一個用戶或者一個機械人可以送出數千次請求,令帳單大幅上升,或者用盡你嘅供應商配額,令功能對所有人都無法使用。按用戶設定限制,可以令成本更可以預測。

速率限制同節流(throttling)係咪一樣?

兩者關係密切,經常互換使用。速率限制通常指拒絕超過限額嘅請求,而節流則可以指放慢請求速度,或者將請求排隊等候,而唔係直接拒絕。

速率限制可以阻止 DDoS 攻擊嗎?

對於小型洪水式攻擊,以及個別用戶或 IP 位址發出嘅濫用,速率限制有幫助;但大型分散式攻擊會同時來自大量位址。防禦呢類攻擊通常喺網絡或 CDN 層面進行,喺流量到達你嘅應用程式之前就攔截。

Mythex · Pricing · 用 AI 建造任何嘢 · 網站及應用程式範本 · Mythex 比較 · AI 應用程式開發詞彙表 · 免費 AI 應用程式開發工具 · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(台灣)