Ruby on rails Sidekiq的民主排队
用户可以创建包含多个任务的Ruby on rails Sidekiq的民主排队,ruby-on-rails,asynchronous,redis,sidekiq,Ruby On Rails,Asynchronous,Redis,Sidekiq,用户可以创建包含多个任务的项目对象。当用户告诉项目执行时,所有这些任务都从Sidekiq放到默认队列中 问题是:如果用户创建了一个包含1000个任务的项目,并点击execute按钮,那么所有这1000个任务都会被放入队列中。如果紧接着,另一个用户创建了一个只有一个任务的项目,当他点击执行这个项目时,它唯一的任务就放在了行的末尾 我希望这一背景过程以更民主的方式进行。如果每个项目都有自己的队列,那么第二个项目中的一个任务很可能在1000个任务队列结束之前执行 为此,我需要为每个项目使用separe
项目
对象。当用户告诉项目执行时,所有这些任务都从Sidekiq放到默认队列中
问题是:如果用户创建了一个包含1000个任务的项目,并点击execute
按钮,那么所有这1000个任务都会被放入队列中。如果紧接着,另一个用户创建了一个只有一个任务的项目,当他点击执行这个项目时,它唯一的任务就放在了行的末尾
我希望这一背景过程以更民主的方式进行。如果每个项目都有自己的队列,那么第二个项目中的一个任务很可能在1000个任务队列结束之前执行
为此,我需要为每个项目使用separe队列,并且应该动态创建它。我尝试使用以下方法来实现这一点,而不是perform\u async
:
Sidekiq::Client.push('queue' => "project_#{self.project.id}", 'class' => TaskWorker, 'args' => [self.id])
但是,当我尝试执行一个项目时,所有的任务都放在一个名为“project\u somenumber”的队列中,但没有一个被执行。似乎当我使用
Sidekiq::Client.push时,我需要告诉队列开始执行。对吗?如何启动该队列?Sidekiq不支持动态队列名称。启动Sidekiq时,您可以使用“Sidekiq-q queue1-q queue2…”告诉它要处理哪些队列。有关详细信息,请参阅Sidekiq的高级选项wiki页面。我也遇到了同样的问题,并通过创建以下帮助器方法解决了此问题:
def sidekiq_queue(name)
[name.to_s, Settings.sidekiq_ns].join('_')
end
...
class MyWorker
sidekiq_options quque: sidekiq_queue(:sync)
end
我使用dynamic settings.yml文件,其中设置了sidekiq名称空间
PS:当然,您应该在sidekiq.yml中设置这个动态队列。这有什么变化吗?我们一直在为我们的一个应用程序使用sidekiq,但规范现在要求动态生成队列(我们拥有的每个设备一个队列)。如果每次我们添加一个设备来接收新的队列,就必须重新启动应用程序,那将是荒谬的。