我正在请求亚马逊产品广告api,代码如下:
products = asins.map do |asin|
item = Amazon::Ecs.item_lookup(asin, response_group: :Large)
json = {asin: item.get_element('Item').get('ASIN'),
manufacturer: item.get_element('ItemAttributes').get('Manufacturer'),
model: item.get_element('ItemAttributes').get('Model')}
end并得到503错误:You are submitting requests too quickly. Please retry your requests at a slower rate.
我发现他们想要每秒1个请求。对我来说,最好的方法是什么?
发布于 2016-08-16 17:46:06
也许只是通过在迭代之间等待一秒钟来减速:
products = asins.map do |asin|
sleep 1 # wait one second before doing the next API call
item = Amazon::Ecs.item_lookup(asin, response_group: :Large)
{
asin: item.get_element('Item').get('ASIN'),
manufacturer: item.get_element('ItemAttributes').get('Manufacturer'),
model: item.get_element('ItemAttributes').get('Model')
}
end 发布于 2016-08-16 18:06:17
使用sleep肯定是第一个想到的解决方案。在我看来,这并不是一个优雅的选择,因为它完全是不可管理的。我会想到一些排队系统来完成这项工作-也许是使用自触发工人的sidekiq?
一些简化的代码:
# some kind of queueing logic, to fetch asins
asin = AsinQueue.fetch
# trigger first worker
LookupWorker.perform_async(asin)
# and the worker itself:
class LookupWorker
include Sidekiq::Worker
def perform(asin)
item = Amazon::Ecs.item_lookup(asin, response_group: :Large)
# all the domain logic
# queue next lookup
next_asin = AsinQueue.fetch
LookupWorker.perform_in(1.second, next_asin)
end
end发布于 2016-08-27 23:01:50
ItemLookup支持批量请求。您可以一次查找最多10个项目。
https://stackoverflow.com/questions/38971067
复制相似问题