Sidekiq - 如何立即执行作业(+在这种情况下使用队列是否有意义)?

时间:2016-05-08 14:04:40

标签: ruby-on-rails ruby priority-queue sidekiq

我有一项任务需要在创建请求后立即生成并尽快完成。

为此,我创建了一个--- :queues: - default - [critical, 10] 文件,我在其中定义了这个:

class GeneratePDFWorker
  include Sidekiq::Worker
  sidekiq_options queue: 'critical', retry: false

  def perform(order_id)
    ...

对于相应的工人,我设置了这个:

GeneratePDFWorker.perform_async(@order.id)

然后,当我打电话给这个工人时:

GeneratePDFWorker.new.perform(@order.id)

所以我正在测试这个。但是 - 我找到this post,据说如果我想立即执行任务,我应该致电:

critical

所以我的问题是 - 我应该使用(new)队列+ GeneratePDFWorker.new.performcritical)方法的组合吗?它有意义吗?

另外,如何验证任务是否以{{1}}执行?

谢谢

3 个答案:

答案 0 :(得分:2)

  

所以我的问题是 - 我应该使用(关键)队列+新(GeneratePDFWorker.new.perform)方法的组合吗?它有意义吗?

使用GeneratePDFWorker.new.perform将在那里运行代码,然后像通常一样使用内联代码(以阻塞方式,而不是异步)。您无法定义队列,因为它没有排队。

答案 1 :(得分:1)

正如步行维基所提到的,GeneratePDFWorker.new.perform(@order.id)将同步呼叫工作人员。因此,如果您从控制器操作执行此操作,请求将阻塞,直到perform方法完成。

我认为您使用Sidekiq为关键任务使用优先级队列的方法是可行的方法。只要你有足够的Sidekiq工作人员,并且你的队列没有积压,任务应该几乎立即运行,因此在进程中运行你的工作人员的好处几乎是零。所以我会说是的,在这种情况下排队是有意义的。

此外,您可能已经意识到这一点,但是sidekiq有一个很棒的监控用户界面:https://github.com/mperham/sidekiq/wiki/Monitoring。这应该可以很容易地获得关于工人绩效的可靠,详细的指标。

答案 2 :(得分:0)

  

我应该使用(关键)队列的组合吗?

<强>我

是的,如果您愿意,可以使用critical队列。重量为2的队列的检查频率是重量为1的队列的两倍。

提示

  • 尽可能减少队列数量。 Sidekiq并非旨在处理大量queues
  • 同时保持weights尽可能简单。如果您希望队列始终按特定顺序处理,只需在没有权重的情况下按顺序声明它们。
  

新的(GeneratePDFWorker.new.perform)方法?

:不,首先在同一个帖子sidekiq中使用asynchronously是不好的。这会妨碍您的应用程序的性能,因为application-server将会忙碌更长时间。这对你来说非常昂贵。那么使用sidekiq会是什么意思?