我正在向shopify-api发送库存更新。这些请求与sidekiq一起排队。Shopify允许每秒2个请求。我找不到一种方法来将sidekiq配置为每秒只处理2个计划的作业。
发布于 2015-11-14 11:42:39
您要做的是降低web应用程序向API发出的请求的数量。又名“速率限制”。
Sidekiq Enterprise提供了一个rate limiting API,它为您提供了三种速率限制选项,其中两种可能会在超过速率限制后引发异常。
Rate limiters do 减慢Sidekiq的作业处理。如果您将1000个作业推送到Redis,Sidekiq将尽可能快地运行这些作业,这可能会导致许多作业失败并出现OverLimit错误。
因此
如果你想慢慢地将作业导入到Sidekiq中,唯一的方法就是手动调度。
话虽如此,现在你有两个选择:你可以放慢redis的速度,或者你可以在你的web应用程序的上下文中自己实现速率限制功能。
作为同一文档页面中的示例:
以下是如何调度每秒1个作业以确保
不会立即运行所有作业的方法:
1000.times do |index|
SomeWorker.perform_in(index, some_args)
end你可能不想让redis慢下来,因为
对于Sidekiq功能,
速率限制在Redis上异常困难
相反,您可以对您正在使用的API抛出的异常执行rescue操作,类似于下面对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的请求限制,如上面的示例所示。
我希望这对你有帮助!
发布于 2015-11-14 21:02:17
我想到了在worker中添加一个类变量的想法,这样我就可以存储一个数组,其中包含上次调度作业的时间戳(以秒为单位)和这一秒的作业数。当我调度一个作业时,我会查看上一个调度秒的数组和数字,并递增秒数和作业数,如果未来一秒有两个,则在下一秒调度我的作业。
https://stackoverflow.com/questions/33698433
复制相似问题