【问题标题】: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按顺序执行?

【问题讨论】:

    标签: ruby-on-rails rake sidekiq 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 工作人员,他们将按照入队的顺序执行。
      猜你喜欢
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 2018-11-05
      相关资源
      最近更新 更多