我正在使用一个API请求,此API的限制为每秒调用2次,每个请求250条记录。这就是要旨。
我创建了该后台作业,该后台作业也可以选择第二个后台作业。这可能是过大的。
流:
要求目标:
如果第一个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/