Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Sidekiq的民主排队_Ruby On Rails_Asynchronous_Redis_Sidekiq - Fatal编程技术网

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,但规范现在要求动态生成队列(我们拥有的每个设备一个队列)。如果每次我们添加一个设备来接收新的队列,就必须重新启动应用程序,那将是荒谬的。