Sidekiq 是不是按照发送给工作人员的顺序执行作业?

Posted

技术标签:

【中文标题】Sidekiq 是不是按照发送给工作人员的顺序执行作业?【英文标题】:Does Sidekiq execute jobs in the order they are sent to a worker?Sidekiq 是否按照发送给工作人员的顺序执行作业? 【发布时间】:2014-05-02 01:33:25 【问题描述】:

我有一个 rake 任务,它将按顺序调用另外 4 个 rake 任务:

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

Rake 任务一、二和三正在获取数据并将其添加到我的数据库中。然后rake:four 将对这些数据进行处理。但我需要先确保一、二、三是完整的。每个 rake 任务实际上都在让 Sidekiq 工作人员在后台运行。在这种情况下,rake:one 创建的所有工作人员会先完成,然后是 rake:two,等等?

如果不是,如何保证worker按顺序执行?

【问题讨论】:

【参考方案1】:

Sidekiq 按创建顺序处理作业,但默认情况下它同时处理多个作业,并且不能保证给定作业会在另一个作业开始之前完成。

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

如何串行处理某个队列?

按照设计,你不能。 Sidekiq 专为异步处理而设计 可以独立完成的工作的数量 其他。作业将按照它们的顺序从 Redis 中弹出 被推送,但不能保证 Job #1 将完全执行 在作业 #2 开始之前。

如果你需要串行执行,你应该看看其他系统 提供这些类型的保证。

请注意,您可以创建一个专门用于处理队列的 Sidekiq 进程 与一个工人。这会给你串行执行,但它是 破解。

另外注意你可以使用sidekiq的第三方扩展来实现 那个目标。

【讨论】:

【参考方案2】:

您可以简单地创建一个元 rake 任务,它将按正确的顺序包含所有这些任务。

或者作为一个不那么 hacky 的解决方案:将每个队列的工作人员数量减少到 1: https://github.com/brainopia/sidekiq-limit_fetch#limits

并将您的所有作业添加到此队列中

【讨论】:

这就是我所做的。但是每个 rake 任务会创建 1000 个工作人员,然后转到下一个工作人员。基本上我在大约 5 秒内创建了 4000 个工人,运行 rake 任务不需要很长时间。那么,这 4000 名工人会按照他们创建的顺序执行吗? @Luigi 假设只有一个 SINGLE 工作人员,他们将按照入队的顺序执行。

以上是关于Sidekiq 是不是按照发送给工作人员的顺序执行作业?的主要内容,如果未能解决你的问题,请参考以下文章

Sidekiq Rails 4.2使用活动作业还是工作者?有什么不同

Sidekiq 是不是适合高度关键任务、需要一次性执行保证、需要单线程执行的任务?

如何使用 Sidekiq 在 Rails 中 3 分钟后发送电子邮件?

Rails 6.1:Heroku 上的作业将使用 Async 而不是 Sidekiq

工作中的 Sidekiq 重试计数

一个线程执行多个任务,按照顺序执行