toy*_*toy 1 api shopify sidekiq
我正在将 stockupdates 发送到 shopify-api。请求通过 sidekiq 排队。Shopify 每秒允许 2 个请求。我找不到将 sidekiq 配置为每秒仅执行 2 个计划作业的方法。
您想要做的是减慢 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 的请求限制之前创建具有重试功能 ( ) 的循环来挽救异常,如上例所示。
我希望这有帮助!