1

用户可以创建一个Project包含多个任务的对象。当用户告诉项目execute所有这些任务都放在 Sidekiq 的默认队列中时。

问题是:如果用户创建了一个包含 1000 个任务的项目并点击了execute按钮,那么所有这 1000 个任务都会被放入队列中。如果就在这之后,另一个用户创建了一个只有一个任务的项目,当他点击执行这个项目时,它的唯一任务被放在行尾。

我希望这个后台进程以更民主的方式工作。如果每个项目都有自己的队列,则很可能第二个项目中的一个任务在 1000 个任务队列结束之前执行。

为此,我需要为每个项目设置单独的队列,并且它应该是动态创建的。我正在尝试使用以下内容而不是perform_async

Sidekiq::Client.push('queue' => "project_#{self.project.id}", 'class' => TaskWorker, 'args' => [self.id])

但是,当我尝试execute一个项目时,所有任务都放在一个名为“project_somenumber”的队列中,但没有一个任务被执行。似乎当我使用时Sidekiq::Client.push,我需要告诉队列开始执行。这是对的吗?我怎样才能开始那个队列?

4

2 回答 2

2

Sidekiq 不支持动态队列名称。当您启动 Sidekiq 时,您可以使用“sidekiq -q queue1 -q queue2 ...”告诉它要处理哪些队列。有关更多详细信息,请参阅 Sidekiq 的高级选项 wiki 页面。

于 2013-05-15T20:59:29.193 回答
0

我有同样的问题并通过创建这样的辅助方法来解决它:

def sidekiq_queue(name)
  [name.to_s, Settings.sidekiq_ns].join('_')
end

...

class MyWorker
  sidekiq_options quque: sidekiq_queue(:sync)
end

我使用设置 sidekiq 命名空间的动态 settings.yml 文件。

PS:当然你应该在 sidekiq.yml 中设置这个动态队列。

于 2015-08-03T22:38:06.480 回答