【问题标题】:configure sidekiq to work only two requests per second将 sidekiq 配置为每秒仅处理两个请求
【发布时间】:2015-11-13 17:23:38
【问题描述】:

我正在向 shopify-api 发送库存更新。请求与 sidekiq 一起排队。 Shopify 允许每秒 2 个请求。我找不到将 sidekiq 配置为每秒仅执行 2 个预定作业的方法。

【问题讨论】:

  • 你似乎很困惑。 API 限制与运行后台作业无关。您运行后台作业是因为它需要很长时间,并且涉及许多 API 请求。如果您需要弄清楚如何限制您的 API 请求,这与您在后台作业中的代码有关,与 Sidekiq 无关。
  • Sidekiq 的官方限速 API 在这里:github.com/mperham/sidekiq/wiki/Ent-Rate-Limiting
  • 我并不困惑,这很容易,我在同一秒内安排了三个工作,一个失败,因为允许两个。我认为应该由后台作业层处理

标签: api shopify sidekiq


【解决方案1】:

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

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 的请求限制,如上例所示。

希望对你有帮助!

【讨论】:

    【解决方案2】:

    我想为我的工作人员添加一个类变量,这样我就可以存储一个数组,其中包含上次计划作业的几秒钟内的时间戳以及这一秒的许多作业。当我安排一个作业时,我会查看最后一个预定秒数的数组和数字,如果未来一秒有两个,则增加秒数和作业,然后在下一秒安排我的作业。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多