将 sidekiq 配置为每秒仅处理两个请求

toy*_*toy 1 api shopify sidekiq

我正在将 stockupdates 发送到 shopify-api。请求通过 sidekiq 排队。Shopify 每秒允许 2 个请求。我找不到将 sidekiq 配置为每秒仅执行 2 个计划作业的方法。

Bry*_*mas 5

您想要做的是减慢 Web 应用程序对 API 发出的请求数量。又名“速率限制”。

Sidekiq Enterprise 提供了速率限制 API,为您提供了三种速率限制选项,其中两个选项可能会在超出速率限制后引发异常。

速率限制器不会减慢Sidekiq 的作业处理速度。如果您将 1000 个作业推送到 Redis,Sidekiq 将尽快运行这些作业,这可能会导致其中许多作业因 OverLimit 错误而失败。

所以

如果您想将作业缓慢地注入 Sidekiq,唯一的方法就是手动调度。

话虽如此,现在您的选择有两个:您可以减慢 Redis 的速度,也可以在 Web 应用程序的上下文中自行实现速率限制功能。

作为同一文档页面的示例:

以下是如何安排每秒 1 个作业,以确保 Sidekiq 不会立即运行所有作业:

1000.times do |index|
  SomeWorker.perform_in(index, some_args)
end
Run Code Online (Sandbox Code Playgroud)

你可能不想减慢 Redis 的速度,因为

对于 Sidekiq 功能,Redis 的速率限制异常困难

相反,您可以rescue使用您正在使用的 API 抛出的异常,类似于此问题的以下答案:

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
Run Code Online (Sandbox Code Playgroud)

总之,除非您想付费购买 Sidekiq Enterprise 并围绕它实施您的解决方案或直接处理 redis,否则我建议您perform_in仅在超出 API 的请求限制之前创建具有重试功能 ( ) 的循环来挽救异常,如上例所示。

我希望这有帮助!