首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在.map循环中限制请求速率?

如何在.map循环中限制请求速率?
EN

Stack Overflow用户
提问于 2016-08-16 17:20:53
回答 3查看 227关注 0票数 1

我正在请求亚马逊产品广告api,代码如下:

代码语言:javascript
复制
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个请求。对我来说,最好的方法是什么?

EN

回答 3

Stack Overflow用户

发布于 2016-08-16 17:46:06

也许只是通过在迭代之间等待一秒钟来减速:

代码语言:javascript
复制
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 
票数 1
EN

Stack Overflow用户

发布于 2016-08-16 18:06:17

使用sleep肯定是第一个想到的解决方案。在我看来,这并不是一个优雅的选择,因为它完全是不可管理的。我会想到一些排队系统来完成这项工作-也许是使用自触发工人的sidekiq?

一些简化的代码:

代码语言:javascript
复制
# 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
票数 0
EN

Stack Overflow用户

发布于 2016-08-27 23:01:50

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38971067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档