您的應用程式執行平穩。 測試通過了。 突然,您開始看到來自api的429錯誤響應。 顧名思義,您發出了太多請求,並且您的應用程式受到速率的限制。 429(請求過多)錯誤是當您遇到api的請求限制時經常發生的http狀態** 。
雖然速率限制在您遇到時似乎是一件壞事,但此限制是大多數可消耗api的保護功能。 速率限制可防止服務受到故意濫用以及開發人員測試應用程式時可能發生的意外濫用。 如果您將水倒入漏斗的速度太快,您會看到它開始倒流並最終溢位。 速率限制旨在通過在問題出現之前停止請求流來防止這種情況。
那麼,作為使用api的開發人員,您能做什麼呢?首先,讓我們看一下導致錯誤的原因以及如何找到api的速率限制詳細資訊。
根據您所構建的應用程式型別的不同,可能會遇到多種情況,例如速率限制。 漫遊器以及持續輪詢api的任何應用程式最有可能遇到該錯誤。 直接讓使用者與第三方api互動的應用程式也有更高的達到極限的風險。 要了解有關api速率限制閾值的更多資訊,最好檢視正在使用的api的文件。
要記住的另一件事是,這些基於時間的限制可能是基於第乙個請求的時間設定的,或者可能具有固定的時間範圍,例如一天的開始。
儘管許多服務將像上面的github示例中那樣發布其限制,但其他服務可能會將限制包括為響應的屬性,或者甚至是僅在達到限制時才顯示的標頭。
您已經看到了錯誤**,但是當請求失敗時,通常會有更多可用資訊。 rest api通常會包括一條描述問題的訊息以及一組x-ratelimit- *標頭,其中包含有關限制的資訊。 某些api(例如github的api)也將在成功請求中包含此api。 每個api都有自己的特定標頭,但是一些與速率限制相關的標頭是:
x-ratelimit-limit:可以發出的請求數量(跨時間段)x-ratelimit-remaining:可以發出的剩餘請求數量(跨時間段).x-ratelimit-reset :重設限制的時間戳。
graphql api將在達到限制時返回錯誤,例如yelp的graphql api ,或者可以提供一種檢查當前用法的方法。 github的v4 graph api通過允許使用者查詢ratelimit物件來做到這一點。
margin: 0 px; padding: 0 px; border: 0 px; font-style: inherit; font-variant: inherit; font-weight: 400 !important ; font-stretch: inherit; line-height: inherit; font-family: consolas, monaco, "andale mono", "ubuntu mono", monospace; font-size: inherit; vertical-align: baseline; background: transparent; border-radius: 3 px; color: rgb(248, 248 , 242 ); text-shadow: rgba(0, 0 , 0 , 0.3 ) 0 px 1 px; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; overflow-wrap: normal; tab-size: 4 ; hyphens: none;">query
}
這些先發制人的方法使您可以在達到限制之前執行檢查,而不僅僅是對錯誤做出反應。
如果api為您提供了包含重置資訊的標頭或錯誤物件,則可以使用它在重新嘗試之前等待適當的時間。 使用resetat-currenttime並使用它在發出另乙個請求之前等待。 您甚至可以將此功能帶到斷路器中 ,或者使用bearer之類的解決方案在某些條件下重試。
如果沒有以程式設計方式知道嘗試等待多長時間,則可以使用「退避」方法,其中**執行一系列重試,每次重試之間的延遲增加。
這些方法不錯,但是如果您提供的api達到了其他api的速率限制,該怎麼辦? 在這種情況下,您將希望限制對api的傳入呼叫,以防止速率限制引起問題。 節流是一種限制**執行的技術。 在這種情況下,請求將受到限制,並使用快取的資料「丟棄」或滿足請求。 這樣,您的應用就會在第三方服務達到極限之前進行干預。 這種方法對於限制昂貴api的使用也很有用。 您甚至可以使用更保守的閾值來實施自己的速率限制,這將阻止您的應用程式達到第三方api的限制。
為了做出更明智的決定,最好監視第三方api的使用。 使用bearer (我工作的公司)之類的工具,您甚至可以設定規則以在使用量達到特定點時通知您,並以程式設計方式對其做出反應 。
考慮到所有這些,您的應用程式應該對「太多請求」錯誤更具彈性。
from:
python 爬蟲 處理429錯誤
http 429表示訪問過快。伺服器在溫柔地提示你,可以爬,但是爬慢一些。控制訪問的速度就可以了。有些伺服器會在返回的頭部中新增 retry after 告訴你多久之後重試。獲取這個值,然後sleep就可以了。捕獲錯誤 try except aiohttp.clientresponseerror a...
過多的ajax請求處理方案
1,定乙個全域性變數來儲存當前所有要執行的ajax請求,作為乙個佇列,只不過這個佇列有且只有乙個存在並執行。2,每次要新建並開始乙個請求是,遍歷這個請求陣列,把之前已經存在的全部停止,把新的請求放進去。這樣能保證不會有過多的ajax請求被發起。var yourquerycontainer new a...
Mysql連線錯誤過多的問題處理
1.mysql連線錯誤太多 sequelizeconnectionerror host xx.xx.xx.xx is blocked because of many connection errors unblock with mysqladmin flush hosts 檢視最大錯誤連線數 mys...