将 ActiveJob 与 Sidekiq 结合使用与单独使用 Sidekiq 相比的优势

问题描述 投票:0回答:3

我正在网上阅读一些教程,告诉我们如何使用 ActiveJob 和 Sidekiq。但我不知道为什么我们应该这样做。我发现 Sidekiq 具有 ActiveJob 的所有功能。

此外,在Sidekiq文档上:这里

警告:通过 ActiveJob 进行作业重试,您会丢失很多 Sidekiq 功能:

  1. Web UI 可见性(“重试”选项卡将为空)
  2. 您无法使用 Sidekiq::RetrySet API 进行迭代重试。
  3. Sidekiq 的日志不会包含任何失败或回溯。
  4. 错误不会报告给 Sidekiq 的全局错误处理程序
  5. 许多高级 Sidekiq 功能(例如批量)将无法与 AJ 重试一起使用。

这个信号在某种程度上让我认为我们不应该将 Sidekiq 与 ActiveJob 一起使用。我对 ActiveJob 的理解有误吗?将 ActiveJobs 与 sidekiq 结合使用有什么优势吗?

谢谢

ruby-on-rails sidekiq rails-activejob
3个回答
7
投票

来自 Rails ActiveJob guide

重点是确保所有 Rails 应用程序都有工作 基础设施到位。然后我们就可以拥有框架功能和其他功能 gems 建立在其之上,无需担心 API 各种作业运行程序之间的差异,例如延迟作业和 雷斯克。选择队列后端变得更加可操作 那么关心。您将能够在它们之间切换,而无需 不得不重写你的工作。

ActiveJob 基本上所做的就是标准化作业队列的 API 接口。这将帮助您轻松地从一种工作后端更改为另一种工作后端。

当您将 Sidekiq 与 ActiveJob 结合使用时,您可以从 sidekiq 提供的好处中受益,但真正的问题是,当您发现另一个队列最适合您的应用程序时,ActiveJob 允许您使用单行程序切换到您选择的作业队列

# application.rb
config.active_job.queue_adapter = :sidekiq

7
投票

对我来说,ActiveJob 的主要特点是支持 GlobalId。比较:

Sidekiq

class SomeJob
  include Sidekiq::Worker
  def perform(record_id)
    record = Record.find(record_id)
    record.do_something
  end
end
SomeJob.perform_async(record.id)

活动作业

class SomeJob < ApplicationJob
  def perform(record)
    record.do_something
  end
end

SomeJob.perform_later(record)

方便又干净!

Sidekiq 6.0 开始,ActiveJob 支持 Sidekiq 的重试


3
投票
Active Job 是排队技术之上的抽象层。

理论上,它允许您对通用接口进行编程,无论您在底层使用什么。

听起来不错吧?嗯,在实践中,直接使用 Sidekiq 会更好。

© www.soinside.com 2019 - 2024. All rights reserved.