ruby-on-rails - 如何或最佳方式运行while循环以避免API限制

标签 ruby-on-rails ruby redis background sidekiq

我正在使用一个API请求,此API的限制为每秒调用2次,每个请求250条记录。这就是要旨。

我创建了该后台作业,该后台作业也可以选择第二个后台作业。这可能是过大的。

流:

  • 订购来自shopify的webhooks
  • 该天每天执行一次Cron作业,以防webhooks失败。

  • 要求目标:

    如果第一个API请求中有>= 250记录/订单,则在新工作线程中创建第二个后台作业,以在大约3分钟内获取第2页,如果第2页具有>= 250,然后在同一工作中创建新的后台作业worker在第2页作业开始3分钟后有第2页(在2完成之后)开始获取第3页,依此类推。等等。如果250语句为true,我将n用于该页面,并将1添加到n

    Cron职位:
     shops = Shop.all
      shops.map do |shop|
        if shop.company.present?
          ShopifyOrderUpdatesWorker.perform_later(shop)
        end 
      end
    

    后台作业1:(用于首次API调用)
          def perform(shop)
            n = 1
            orders = ShopifyAPI::Order.find(:all, params: {created_at_min: 1.day.ago.beginning_of_day.iso8601}, limit: 250, page: n )
            while (orders.count >= 250) || n == 1
              unless n =< 1 
                while n > 1 && orders.count >= 250
                  orders = ShopifyAPI::Order.find(:all, params: {created_at_min: 1.day.ago.beginning_of_day.iso8601 }, limit: 250, page: n)
                  #while orders.count >= 250 || n == 2
                    t = 3
    ShopifyOrderUpdatesLimitWorker.delay_for(t.minutes).perform_later(orders)
                    n += 1 #add page to API call request
                    t += +3 #add 3 minutes for each loop to buffer the api call queue to avoid api limits to be safe
                  #end
                end
              end
              if n == 1
                orders.map do |order|
                  #code here
                end
              end
              n += 1
            end
          end
    

    后台作业2:(对于第一个之后的任何API调用)
      def perform(orders)
        orders.map do |order|
          #code here
        end
      end
    

    这样,所有商店都可以“快速”更新,而不必排在其他商店后面。有很多订单的商店将在一次或两次完成所有这些操作的同一时间等待。

    这是过度杀伤力吗?正确完成代码

    实际上,webhook失败的可能性非常小,因此调用第二个后台作业的机会很小。

    对代码有任何可能的改进或建议吗?

    这可能不是问这个问题的合适地点,但是如果有人有过Shopify或类似的api经验,那么您在做什么?

    最佳答案

    sleep(30) if ShopifyAPI.credit_maxed?
    

    在您的循环中添加

    关于ruby-on-rails - 如何或最佳方式运行while循环以避免API限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57910691/

    相关文章:

    ruby-on-rails - 如何阻止 "mail.ru"和 "163.com"电子邮件注册 (Devise + Rails 4)

    如果端口更改,redis-cli 不工作

    javascript - 我们可以使用 Jmeter 运行特定的 Redis 查询吗?

    ruby-on-rails - 在 Rails 中通过 current_user 访问数据库字段

    ruby-on-rails - 使用电子表格 gem 的货币数字格式

    ruby - 重载! Ruby 中的运算符

    ruby-on-rails - 您的 Gemfile 中有错误,Bundler 无法继续

    ruby-on-rails - 韦布里克的 react 非常缓慢。如何加快速度?

    ruby-on-rails - rails5 api + devise_token_auth : no access-token and uid returns after login successfully via omniauth2

    ruby-on-rails - 在这种情况下使用 Redis 合适吗?