我有一个rake任务,它将按顺序调用另外4个rake任务:
rake:one
rake:two
rake:three
rake:four
一个,两个和三个Rake任务正在获取数据并将其添加到我的数据库中。然后rake:four
将对该数据执行某些操作。但我需要确保首先完成一,二和三。每个rake任务实际上都是让Sidekiq工作人员在后台运行。在这种情况下,rake:one
创建的所有工作人员是先完成,然后是rake:two
等吗?
如果没有,我如何确保工人按顺序执行?
答案 0 :(得分:4)
Sidekiq按创建顺序处理作业,但默认情况下它会同时处理多个作业,并且无法保证在另一个作业启动之前完成给定作业。
引自https://github.com/mperham/sidekiq/wiki/FAQ:
如何以串行方式处理某个队列?
你不能,按设计。 Sidekiq专为异步处理而设计 可以孤立地完成并独立完成的工作 其他。工作将按照他们的顺序从Redis中弹出 被推了但是不能保证Job#1会完全执行 在作业#2开始之前。
如果您需要串行执行,您应该查看其他系统 给出那些类型的保证。
请注意,您可以创建专用于处理队列的Sidekiq进程 与一名工人。这将为您提供序列执行,但它是一个 破解。
另请注意,您可以使用sidekiq的第三方扩展来实现 那个目标。
答案 1 :(得分:0)
您只需创建一个元rake任务,其中包含正确顺序的所有任务。
或者作为一个不太常见的解决方案:将每个队列的工作人员数量减少到1: https://github.com/brainopia/sidekiq-limit_fetch#limits
并将所有作业添加到此队列