每个请求延迟1秒,不够每小时延迟3600秒



Amazon API限制显然是每秒1个请求或每小时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 Key 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)。根据一系列因素,处理器测量的时间可能相当不可靠。

这是由于Amazon的API与您的程序具有不同的时钟。它们当然不是同步的,它们的"1秒"时间度量和您的程序之间可能有一些重叠。很可能亚马逊试图平均这种不一致性,他们也可能允许一点错误,可能是+/- 5%。即便如此,你的时钟和他们的时钟之间的差异可能会触发ACCESS_KEY_REDACTED信号。

给自己一些缓冲区

这里有一些想法可以考虑。

你真的需要每秒钟都访问Amazon API吗?你的程序能在5秒的间隔下工作吗?即使间隔2秒,触发锁定的可能性也会降低200%。此外,亚马逊可能会向你收取每一次服务电话的费用,所以把它们分开可以节省你的钱。

现在这真的是一个"优化"的问题。如果您使用一个常量变量来控制API调用速率(例如,SLEEP = 2),那么您可以轻松地调整该速率。摆弄它,增加或减少它,看看你的程序是如何执行的。

推,不要拉

有时,每秒访问一个API意味着您正在轮询以获取新数据。轮询是出了名的浪费,这就是为什么Amazon API有速率限制。

相反,您可以切换到基于队列的方法吗?Amazon SQS可以向您的程序发送事件。如果您使用Amazon Lambda托管它们,这尤其容易。

最新更新