Sidekiq是否按照发送给工作进程的顺序执行任务?

12

我有一个草率任务,将调用4个更多的草率任务,按顺序:

rake:one
rake:two
rake:three
rake:four

任务 rake:one、rake:two 和 rake:three 正在获取数据并将其添加到我的数据库中,然后任务 rake:four 将对这些数据执行某些操作。但我需要确保先完成任务 one、two 和 three。实际上,每个 Rake 任务都会启动 Sidekiq 后台工作进程。在这种情况下,由 rake:one 创建的所有工人都会先完成,然后是 rake:two 等吗?

如果不是,我如何确保按顺序执行这些后台工作进程?

2个回答

10

Sidekiq会按照任务创建的顺序处理任务,但默认情况下它会同时处理多个任务,并且不能保证一个任务在另一个任务启动之前完成。

引用自https://github.com/mperham/sidekiq/wiki/FAQ:

如何串行处理某个队列?

设计上不支持。Sidekiq旨在异步处理可以独立完成且相互独立的任务。任务将按照它们被推入Redis的顺序弹出,但无法保证作业#1在启动作业#2之前完全执行。

如果需要串行执行,则应查看其他可以提供此类保证的系统。

请注意,您可以创建一个专用于处理单个工人的Sidekiq进程。这将为您提供串行执行但这是一种hack方法。

还要注意,您可以使用第三方扩展来实现这一目标。


0
你可以创建一个 meta rake 任务,它将按正确的顺序包含所有这些任务。
或者,作为一种不那么 hacky 的解决方案:将每个队列的工作人员数量减少到 1: https://github.com/brainopia/sidekiq-limit_fetch#limits 并将所有工作都添加到此队列中。

这就是我所做的。但是每个 rake 任务都会创建 1000 个 worker,然后进入下一个任务。基本上,在大约 5 秒钟内创建了 4000 个 worker,rake 任务运行起来并不需要很长时间。那么,这些 4000 个 worker 是否会按照它们被创建的顺序执行? - Luigi
@Luigi,鉴于只有一个“单一”的工作人员,他们将按照入队的顺序执行。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接