首页 文章

与Sidekiq一起使用ActiveJob与单独使用Sidekiq相比的优势

提问于
浏览
4

我正在网上阅读一些教程,告诉我们使用Sidekiq的ActiveJob . 但我不知道为什么要这样做 . 我看到Sidekiq拥有ActiveJob拥有的所有功能 .

此外,在Sidekiq文件:here

警告:通过ActiveJob进行作业重试,会丢失很多Sidekiq功能:Web UI可见性(Retries选项卡将为空)您无法使用Sidekiq :: RetrySet API迭代重试 . Sidekiq的日志不包含任何失败或回溯 . 不会向Sidekiq的全局错误处理程序报告错误许多高级Sidekiq功能(例如批处理)将无法与AJ重试一起使用 .

这是一个让我觉得我们不应该将Sidekiq与ActiveJob一起使用的信号 . 我对ActiveJob的理解有误吗?将ActiveJobs与sidekiq一起使用时有什么优势吗?

谢谢

2 回答

  • 0

    来自rails ActiveJob guide

    重点是确保所有Rails应用程序都具有适当的作业基础结构 . 然后我们可以在此基础上构建框架功能和其他宝石,而不必担心各种作业运行程序(如Delayed Job和Resque)之间的API差异 . 那么,挑选你的排队后端就变成了一个操作问题 . 而且您无需重写工作就可以在它们之间切换 .

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

    当您使用Sidekiq和ActiveJob时,您可以从sidekiq提供的好东西中受益,但真正的问题是当您发现另一个最适合您的应用程序时,ActiveJob允许您通过一个班轮切换到您选择的工作机

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

    至于我,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)
    

    ActiveJob

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

    这么方便,更干净!

    关于重试 - 是的,它知道为什么在ActiveJob中忽略了为每个作业配置自己的参数的底层系统可能性的功能 . 至于解决方法,可以使用gem activejob-retry

    class SomeJob
      include ActiveJob::Retry.new(strategy: :exponential, limit: 0)
    end
    

    这会禁用ActiveJob 's retries while Sidekiq'重试仍然有效 . 's possible to configure sidekiq'在配置文件中重试's possible to configure sidekiq'

相关问题