我有一项任务需要在创建请求后立即生成并尽快完成。
为此,我创建了一个---
: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.perform
(critical
)方法的组合吗?它有意义吗?
另外,如何验证任务是否以{{1}}执行?
谢谢
答案 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
会是什么意思?