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

我正在使用一个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?
    

    在您的循环中添加