配置sidekiq每秒只能处理两个请求

时间:2015-11-13 17:23:38

标签: api shopify sidekiq

我将stockupdates发送到shopify-api。请求与sidekiq排队。 Shopify每秒允许2次请求。我找不到一种方法来配置sidekiq每秒只能处理2个预定作业。

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添加一个类变量,这样我就可以存储一个数组,其中包含最后一个计划作业的秒数,以及第二个作业数。当我安排一个工作时,我会查看最后一个计划的第二个数字和数字,如果有两个未来的秒数,则增加秒数和工作数,并在下一秒安排我的工作。