我将stockupdates发送到shopify-api。请求与sidekiq排队。 Shopify每秒允许2次请求。我找不到一种方法来配置sidekiq每秒只能处理2个预定作业。
答案 0 :(得分:2)
您要做的是减慢Web应用程序对API的请求数量。 Aka“限速”。
Sidekiq Enterprise提供rate limiting API,为您提供三种速率限制选项,其中两种可能会在超出速率限制后引发异常。
速率限制器不减慢Sidekiq的工作处理速度。如果你推 到Redis的1000个工作,Sidekiq将尽快运行这些工作 这可能会导致许多作业因OverLimit错误而失败。
因此
如果你想慢慢将工作流入Sidekiq,唯一的办法就是这样做 这是手动调度。
话虽如此,现在您的选择是双重的:您可以减慢redis,也可以在Web应用程序的上下文中自行实现速率限制功能。
作为同一文档页面中的示例:
以下是您每秒安排1份工作以确保Sidekiq的方法 没有立即运行所有工作:
1000.times do |index|
SomeWorker.perform_in(index, some_args)
end
你可能不想因为
而放慢redis对于Sidekiq功能,Redis的速率限制异常困难
相反,您可以rescue
您正在使用的API抛出的异常,类似于this question的以下答案:
class TwitterWorker
include Sidekiq::Worker
def perform(status_id)
status = Twitter.status(status_id)
# ...
rescue Twitter::Error::TooManyRequests
# Reschedule the query to be performed in the next time slot
TwitterWorker.perform_in(15.minutes, status_id)
end
end
总之,除非你想支付Sidekiq Enterprise并实现你的解决方案或直接处理redis,我建议你拯救异常创建一个带有重试功能的循环(perform_in
),直到你已超出API的请求限制,如上例所示。
我希望有所帮助!
答案 1 :(得分:0)
我想到了为我的worker添加一个类变量,这样我就可以存储一个数组,其中包含最后一个计划作业的秒数,以及第二个作业数。当我安排一个工作时,我会查看最后一个计划的第二个数字和数字,如果有两个未来的秒数,则增加秒数和工作数,并在下一秒安排我的工作。