每个请求延迟1秒,不足以达到每小时3600

时间:2016-09-24 13:39:17

标签: python amazon-product-api

Amazon 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。您提交的请求太快了。请以较慢的速度重试您的请求。

任何想法为什么?

2 个答案:

答案 0 :(得分:1)

此代码看起来正确,看起来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

答案 1 :(得分:0)

计算机时间很有趣

这篇文章在说&#34时是正确的;它以不确定的方式变化" (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托管它们,这将特别容易。