簡體   English   中英

每個請求延遲1秒,不足以達到每小時3600

[英]Delaying 1 second per request, not enough for 3600 per hour

亞馬遜API限制顯然是每秒1 req或每小時3600。 所以我實現了它:

while True:
    #sql stuff
    time.sleep(1)
    result = api.item_lookup(row[0], ResponseGroup='Images,ItemAttributes,Offers,OfferSummary', IdType='EAN', SearchIndex='All')
    #sql stuff

錯誤:

amazonproduct.errors.TooManyRequests:RequestThrottled:AWS Access密鑰ID:ACCESS_KEY_REDACTED。 您提交的請求太快了。 請以較慢的速度重試您的請求。

有什么想法嗎?

此代碼看起來是正確的,看起來仍然有1個請求/秒限制: http//docs.aws.amazon.com/AWSECommerceService/latest/DG/TroubleshootingApplications.html#efficiency-guidelines

您希望確保沒有其他進程使用相同的關聯帳戶。 根據您運行代碼的位置和方式,可能有舊版本的VM,或者您的應用程序的另一個實例正在運行,或者雲上有一個版本,筆記本電腦上有另一個版本,或者如果您使用的是線程Web服務器,可能有多個線程都運行相同的代碼。

如果仍然達到查詢限制,則只需要重試,可能使用類似TCP的“加法增加/乘法減少”退避。 首先設置extra_delay = 0 當請求失敗時,您設置extra_delay += 1sleep(1 + extra_delay) ,然后重試。 當它最終成功時,設置extra_delay = extra_delay * 0.9

電腦時間很有趣

這篇文章說“它以不確定的方式變化”是正確的( https://stackoverflow.com/a/1133888/5044893 )。 根據許多因素,處理器測量的時間可能非常不可靠。

亞馬遜的API具有與您的程序不同的時鍾,這更加復雜。 它們當然不是同步的,並且它們的“1秒”時間測量與您的程序之間可能存在一些重疊。 亞馬遜很可能試圖平衡這種不一致性,他們可能也會允許一點點錯誤,可能是+/- 5%。 即便如此,您的時鍾與他們的時鍾之間的差異可能會觸發ACCESS_KEY_REDACTED信號。

給自己一些緩沖

以下是一些需要考慮的問題。

你真的需要每一秒點擊亞馬遜API嗎? 你的程序會以5秒的間隔工作嗎? 即使是2秒間隔,觸發鎖定的可能性也會降低200%。 此外,亞馬遜可能會收取每個服務電話的費用,因此將它們隔開可以節省您的錢。

這實際上是一個“優化”的問題。 如果您使用常量變量來控制API調用率(例如, SLEEP = 2 ),那么您可以輕松調整該速率。 擺弄它,增加和減少它,看看你的程序如何執行。

推,不拉

有時,每秒點擊一次API意味着您正在輪詢新數據。 眾所周知,輪詢是浪費,這就是為什么Amazon API具有速率限制的原因。

相反,你可以切換到基於隊列的方法嗎? Amazon SQS可以為您的程序啟動事件。 如果您使用Amazon Lambda托管它們,這將特別容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM