web-dev-qa-db-ja.com

Sidekiq Rails 4.2アクティブなジョブまたはワーカーを使用しますか?違いは何ですか?

これは私の最初の非同期処理ジョブです。アプリでバックグラウンド処理のためにSidekiqを実装しています。リマインダーメールとアプリ内通知に使用します。 Active Jobを使用して電子メールを送信するジョブを作成するか、Sidekiq Workerを使用して電子メールを送信するかについて混乱しています。彼らは同じことをしているようで、Rails 4.2 Active Jobは非常に新しいようです...それはSidekiqワーカーの必要性に取って代わりますか?

以下は、アクティブジョブジョブとSidekiqワーカーを使用してメーラーコードを送信する場合と同じです。私はスケジューリングにいつでもgemを使用しています。

my_mailers.rb

class MyMailers < ActionMailer::Base

  def some_mailer(r.user_id)
    @user = User.find(r.user_id)
    mailer_name = "ROUNDUP"
    @email = @user.email
    @subject ="subject text"
    mail(to: @email, 
      subject: @subject,  
      template_path: '/notifer_mailers', 
      template_name: 'hourly_roundup.html',
      )
  end
end

Sidekiq "Worker"を使用
some_worker.rb

class SomeWorker
  include Sidekiq::Worker

  def perform()
    @user = User.all
    @reminders = @user.reminders.select(:user_id).uniq.newmade
    @reminders.each do |r|
      MyMailers.some_mailer(r.user_id).deliver_later
    end
  end

end

アクティブなジョブ「ジョブ」を使用
some_job.rb

class SomeJob < ActiveJob::Base
  queue_as :mailer

  def perform()
    @user = User.all
    @reminders = @user.reminders.select(:user_id).uniq.newmade
    @reminders.each do |r|
      MyMailers.some_mailer(r.user_id).deliver_later
    end
  end

end

いつでもスケジューラの両方の例 schedule.rb

require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
set :path, Rails.root
set :output, Rails.root.join('log', 'cron.log')

#using a worker
every 1.day, :at => '4:30 am' do
  runner SomeWorker.perform_async
end

#using a job
every 1.day, :at => '4:30 am' do
  runner SomeJob.perform_async
end
29

簡単に言えば、それらは同じものです。 ActiveJobはジョブと呼び、Sidekiqはワーカーと呼びます。この2つの用語を区別できるように、用語を異なるものにすることにしました。

どちらでも使用できます。 ActiveJobはSidekiqオプションの完全なセットへのアクセスを提供しないため、ジョブのオプションをカスタマイズする場合は、Workerにする必要があります。

53
Mike Perham

Rails 4.2はActiveJobを追加してジョブAPIを統合しましたが、非同期で実行するにはバックグラウンドハンドラが必要です。これがsidekiqの由来です。

Sidekiqにはすでにワーカークラスがありますが、新しいアクティブジョブクラスも実装されているため、どちらの方法でも機能します。

ただし、アクティブなジョブの良い点は、コードを変更せずにバックグラウンドハンドラーを変更できることです。ただし、両方が必要な機能をサポートしている場合(例:特定の時間にジョブを処理する、複数の優先キューを持つ)。

Rails api guide here があります。これには、アクティブなジョブをサポートするハンドラー(各ハンドラーがサポートする機能を含む)の適切な比較が含まれています。リンクをチェックするのが面倒な場合の比較表は次のとおりです。

|                   | Async | Queues | Delayed   | Priorities | Timeout | Retries |
|-------------------|-------|--------|-----------|------------|---------|---------|
| Backburner        | Yes   | Yes    | Yes       | Yes        | Job     | Global  |
| Delayed Job       | Yes   | Yes    | Yes       | Job        | Global  | Global  |
| Qu                | Yes   | Yes    | No        | No         | No      | Global  |
| Que               | Yes   | Yes    | Yes       | Job        | No      | Job     |
| queue_classic     | Yes   | Yes    | No*       | No         | No      | No      |
| Resque            | Yes   | Yes    | Yes (Gem) | Queue      | Global  | Yes     |
| Sidekiq           | Yes   | Yes    | Yes       | Queue      | No      | Job     |
| Sneakers          | Yes   | Yes    | No        | Queue      | Queue   | No      |
| Sucker Punch      | Yes   | Yes    | No        | No         | No      | No      |
| Active Job Inline | No    | Yes    | N/A       | N/A        | N/A     | N/A     |
| Active Job        | Yes   | Yes    | Yes       | No         | No      | No      |
21

他の機能については、ネイティブsidekiqを使用することをお勧めします。また、ActiveJobで奇妙なシリアル化の問題に時々遭遇しました。 ActiveJobは、統一されたAPIを実施するという高貴な目標を追求していますが、この理由で多くの実装を厳密に制限し、現在のIMOには少しの利点を提供します。個人的には、将来的にコードを書き換える可能の価格を支払うことに熱心です(決して起こらないかもしれません。 activerecord vs mongodb)実装をより豊富な機能セットに交換することにした場合。

6
Dr.Strangelove

ドキュメントによると、ActiveJobよりSidekiq :: Workerを使用するとパフォーマンスが向上する可能性があります。

https://github.com/mperham/sidekiq/wiki/Active-Job#performance

0
Chad M