簡而言之:RPC 速率限制是一種機制,用於限制您的應用程式在特定時間窗內可向區塊鏈節點發送的請求數量。當您超過此限制時,後續的請求將會被拒絕(通常會回傳 HTTP 429 錯誤),直到該時間窗重置為止。速率限制的存在旨在保護共享基礎設施免於遭濫用,並確保所有使用者都能公平地存取資源。理解並管理速率限制,對於建構在高負載下仍能穩定運作的可靠區塊鏈應用程式至關重要。
簡單的解釋
試想一家每小時能準備 100 份餐點的餐廳廚房。如果 50 位顧客每人點 3 道菜,廚房便已達到飽和狀態。若有一位顧客試圖點 50 道菜,廚房就必須拒絕這筆訂單,才能確保其他顧客仍能用餐。速率限制的運作原理亦是如此。區塊鏈節點的處理能力是有限的,而速率限制能確保沒有任何單一應用程式會壟斷這項處理能力,從而損害其他使用相同基礎設施的用戶權益。
當您的應用程式在過短時間內發送過多 RPC 請求時,節點會回傳錯誤訊息,而非您所請求的資料。在大多數服務供應商處,這會顯示為 HTTP 429「請求過多」狀態碼,通常會附帶一個 JSON-RPC 錯誤內容,其中會告知您允許的請求數量、您已嘗試的請求數量,以及下次嘗試前應等待的時間長度。 若您的應用程式忽略這些訊號並持續發送請求,服務提供者可能會暫時封鎖您的 IP 位址,甚至完全停用您的 API 金鑰。
請求速率限制通常以每秒請求次數(RPS)、每分鐘請求次數,或兩者的組合來表示。 服務供應商可能會在免費方案中允許 25 RPS、在成長方案中允許 300 RPS,而在企業方案中則允許 1,000+ RPS。部分供應商還會實施「按方法」的限制,這意味著某些運算成本較高的方法(例如 debug_traceTransaction 或涉及大型區塊範圍的 eth_getLogs),其單次請求上限會低於像 eth_blockNumber 這種輕量級方法。
為何會設有速率限制
速率限制主要有三大目的。首先,它是為了保障基礎設施的穩定性。區塊鏈節點是具有狀態的系統,負責維護整個區塊鏈的資料,並執行諸如 EVM 呼叫和狀態查詢等複雜操作。若請求量不受限制地激增,可能會使節點的 CPU、記憶體、磁碟 I/O 或網路頻寬不堪負荷,進而導致所有使用者的效能下降,甚至使節點完全當機。速率限制如同斷路器,能防止任何單一客戶端引發連鎖故障。
其次,速率限制能確保資源的公平分配。在共享基礎架構中(這正是多數開發者所使用的),數百或數千個應用程式會共用同一組節點。若無速率限制,單一應用程式若執行過度耗資源的索引腳本,或因配置錯誤而觸發輪詢迴圈,便可能耗盡大部分可用容量,導致其他應用程式無法獲得所需的資源。速率限制透過執行公平使用政策,確保每個應用程式都能獲得合理的資源配額。
第三,速率限制是防止濫用的防禦措施。無論是蓄意或意外的拒絕服務攻擊,都可能導致許多應用程式所依賴的基礎設施癱瘓。速率限制既能防止惡意行為者將公開端點作為攻擊工具,也能避免善意的開發者因腳本失控而意外對節點發動分佈式拒絕服務攻擊。
速率限制如何影響您的應用程式
如果您的應用程式未針對速率限制進行設計,它將在生產環境中發生故障。最常見的失敗原因mode 在於輪詢迴圈過於頻繁地查詢區塊鏈。一個每 100 毫秒呼叫一次「eth_blockNumber」來檢查是否有新區塊的應用程式,光是這個方法每分鐘就會發出 600 次請求。再加上每名活躍用戶的餘額檢查、日誌查詢以及交易狀態輪詢,即使面對寬鬆的速率限制,也很容易就會超額。
WebSocket 訂閱也可能觸發速率限制。雖然初始訂閱請求僅計為一次呼叫,但來自伺服器的每則傳入訊息(例如新的區塊通知或待處理交易警示),在某些服務供應商處可能會計入您的使用量。若您的應用程式跨多個合約訂閱高頻率事件streams ,傳入訊息的數量可能會迅速累積。
因速率限制而失敗的請求會產生連鎖反應。當您的應用程式未能收到所請求的資料時,可能會重新嘗試該請求,進而增加系統負載。若重新嘗試機制未採用指數退避法,便會形成一個正回饋迴圈:受速率限制的請求會產生更多請求,而這些請求又會觸發更多速率限制。這種模式會使您的應用程式實際上被排除在 RPCendpoint 之外,直到速率限制窗口重置為止。
處理速率限制的策略
最有效的策略是減少應用程式所需發出的請求數量。快取是此方法的基礎。若您的應用程式會顯示 ETH 價格、代幣元資料或其他變化緩慢的資料,請將這些結果快取在本地端,並在合理的間隔內進行更新,而非在每次頁面載入或使用者操作時都向節點發送查詢。對於每塊鏈都會變化的資料,請透過 WebSocket 訂閱,而非透過 HTTP 進行輪詢,因為單一訂閱即可取代數千次個別的輪詢請求。
將請求進行批次處理可減少 HTTP 開銷,並有助於讓您符合速率限制。與其針對 10 個不同的錢包餘額分別發出 10 次獨立呼叫,不如將它們批次化為單一的 JSON-RPC 陣列請求。節點會分別處理每個項目,但您只需使用一次 HTTP 請求即可傳送所有項目。請注意,某些服務供應商會將批次中的每個方法呼叫都計入您的速率限制,而不僅僅是 HTTP 請求本身。
實作客戶端速率限制是一種防禦性的最佳實務。與其等待伺服器拒絕您的請求,不如追蹤外發請求的速率,並將可能超過已知限制的請求排入佇列或延遲處理。這樣能主動將應用程式維持在合理範圍內,並避免因請求被拒絕而造成的延遲損失。透過 bottleneck(Node.js)或 ratelimit(Python)等函式庫,可以輕鬆實現此功能。
根據您的使用情境選擇合適的基礎架構層級,終究是最可靠的解決方案。如果您的應用程式持續觸發速率限制,那它需要的不是更多的優化技巧,而是更大的處理能力。升級至更高層級或遷移至專用基礎架構,便能徹底消除速率限制帶來的顧慮。
HTTP 429 錯誤代表什麼意思?
HTTP 429「請求過多」回應表示您已超過當前時間區間的允許請求速率。節點並未故障,您的憑證通常也無問題;您只是發送請求的速度超過了方案允許的範圍。解決方法是仔細閱讀回應內容(其中通常會包含需等待的時間),然後在該延遲時間過後,採用指數退避法重新嘗試,以免重複失敗造成更多負載。 若持續出現 429 錯誤,表示您應減少請求量或升級至更高容量的方案,而非一味增加重試次數。了解RPC 請求的運作原理,以及RPCendpoint如何處理呼叫,將有助於釐清為何某些方法會比其他方法更早觸及限制。
該如何避免觸發 RPC 速率限制?
要規避速率限制,關鍵在於減少請求數量、降低請求成本,並將請求分散開來。下表彙整了影響力最大的幾種技巧,以及每種技巧最適用的情境。
技巧 | 功能說明 | 最適合 |
|---|---|---|
快取 | 針對變化緩慢的資料重複使用結果 | 價格、元資料、餘額 |
串流與輪詢 | 以推送資料取代重複的擷取操作 | 按區塊進行的更新與索引建立 |
批次處理 | 將多個呼叫合併為一個請求 | 批量讀取,如同多次讀取餘額一般 |
從輪詢模式切換至串流模式,通常是減少請求數量的最有效方法。當優化措施已不足以應對時,便會面臨「自建還是外購」的抉擇,這取決於您希望擁有多少處理能力與可靠性。
速率限制與流量控制之間有何區別?
雖然這兩個術語常被互換使用,但它們描述的是面對過載時不同的應對方式。速率限制會強制設定一個硬性上限:一旦超過此上限,請求便會被直接拒絕,通常會返回 429 狀態碼。流量控制則較為寬鬆:系統不會拒絕請求,而是會減慢請求處理速度或將其排入佇列,讓請求仍能完成,只是速度較慢。兩者皆能保護共用基礎架構,但從客戶端的角度來看,它們的失敗方式卻不盡相同。
面向 | 速率限制 | 流量限制 |
|---|---|---|
對過度的回應 | 拒絕請求 | 導致請求變慢或排隊 |
典型訊號 | HTTP 429 錯誤 | 延遲增加 |
對客戶的影響 | 呼叫失敗,將重新嘗試 | 延遲但已完成之通話 |
從應用程式的角度來看,這兩者都可能導致RPC 延遲惡化,而且兩者都與您基礎架構中的整體吞吐量與延遲之間的權衡有關。
常見問題
什麼樣的 RPC 速率限制是可接受的?
這取決於您的工作負載和服務方案。免費方案每秒可能允許約 25 次請求,而成長型和企業型方案則可達數百或數千次。合適的上限應是:在您已應用快取、批次處理和串流技術後,仍能輕鬆超越您尖峰請求率的數值。
我該如何處理 429 回應?
與其不斷轟炸endpoint ,不如採取退避策略並重新嘗試。請使用帶有抖動的指數退避機制,遵守回應中任何「重試間隔」的提示,並設定重試次數上限。若持續收到 429 錯誤,請減少請求量或升級容量,而非更頻繁地重試。
批次請求是否算作一次請求?
不一定。批次請求會以單一 HTTP 請求的形式傳送,但許多服務供應商會將批次內每個方法呼叫都計入您的速率限制。批次處理雖然仍能降低網路開銷,但未必能減少受限呼叫的次數。
串流播放能避開流量限制嗎?
在很大程度上,是的,這主要適用於資料匯入。基於推送的串流會在區塊鏈資料產生時立即傳送,而非需要進行數千次輪詢呼叫,這能消除大部分原本會觸發速率限制的請求量。
為什麼某些方法的速率限制會更嚴格?
像交易追蹤或大規模日誌查詢這類運算成本高昂的方法,所消耗的節點資源遠多於擷取最新區塊編號等輕量級呼叫。服務提供者會針對這些耗資源的呼叫設定更嚴格的每項方法限制,以維護整體節點的穩定性。
Quicknode 如何處理速率限制
Quicknode 提供靈活的速率限制控制功能,讓開發人員能自主管理其endpoint 的使用狀況。除了方案層級的 RPS 限制外,Quicknode 還提供方法層級的速率限制,讓您能針對個別 RPC 方法設定精確的限制。這對於保護您的endpoint 免受失控的腳本或可能過度呼叫資源消耗型方法的第三方整合程式影響,特別有用。 您可以針對每個方法,透過儀表板使用者介面或透過 Console API 以程式化方式,設定每秒、每分鐘或每天的限制。
Quicknode 此外,該服務還提供基於 IP 的速率限制功能,用以控制來自個別 IP 位址的總請求量;當您的endpoint 對外開放給客戶端應用程式,且您無法完全控制請求量時,此功能便十分實用。Quicknode 儀表板上的即時分析資料會顯示您的方法呼叫量、回應狀態及回應時間,讓您能全面掌握使用模式,從而於問題演變成速率限制問題之前,及早識別並加以解決。
對於需要完全突破速率限制的團隊而言,Quicknode Streams 將請求-回應模式替換為推送式資料傳輸模型。與其讓您的應用程式每分鐘向節點進行數千次輪詢,Streams 會在產生新區塊時,直接將區塊鏈資料推送至您的 webhook、資料庫或資料倉儲。這不僅能徹底消除資料攝取工作負載中的 RPC 速率限制,同時還能降低延遲並簡化您的後端架構。
延伸閱讀
如何設定方法速率限制-Quicknode 指南
高效 RPC 請求指南-Quicknode
Streams 入門指南 - Quicknode 文件
Quicknode Core API