如何限制.map循环中的请求率?

时间:2016-08-16 09:20:53

标签: ruby-on-rails ruby ruby-on-rails-4 amazon-product-api

我正在使用以下代码请求亚马逊产品广告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个请求。 在我的案例中,最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

使用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

答案 1 :(得分:0)

ItemLookup支持批量请求。您一次最多可以查找10个项目。