Sidekiq Rails 4.2 utiliser le travail actif ou le travailleur? Quelle est la différence

ceci est mon premier travail de traitement asynchrone je suis en train d'implémenter Sidekiq pour le traitement d'arrière-plan dans mon application. Je l'utiliserai pour les e-mails de rappel et les notifications in-app. Je ne sais pas si je dois utiliser Active Job pour créer un emploi qui envoie un e-mail ou un travailleur de Sidekiq pour envoyer un e-mail. Ils semblent faire la même chose et les Rails 4.2 emploi actif semble très nouveau...est-ce qu'il remplace le besoin d'un travailleur de Sidekiq?

ci-dessous est le même envoi d'un code mailer en utilisant un Emploi actif et travailleur auxiliaire. J'utilise Whenever gem pour programmer.

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

utilisation D'un "ouvrier" de Sidekiq

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

à l'Aide Active de l'Emploi "Job"

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

les deux exemples dans mon whenever scheduler annexe.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
23
demandé sur Douglas Lise 2015-04-28 20:12:00

3 réponses

brève réponse est qu'ils sont la même chose. ActiveJob appelle ça un travail alors que Sidekiq appelle ça un travailleur. J'ai décidé de garder la terminologie différente pour que les gens puissent distinguer les deux.

Vous pouvez utiliser l'un des deux. Notez que ActiveJob ne fournit pas l'accès à l'ensemble complet des options Sidekiq, donc si vous voulez personnaliser les options pour votre travail, vous pourriez avoir besoin d'en faire un travailleur.

35
répondu Mike Perham 2015-04-28 17:39:07

Rails 4.2 ajouté ActiveJob pour unifier L'API jobs mais pour l'exécuter de manière asynchrone, vous avez besoin d'un gestionnaire d'arrière-plan, c'est de là que vient le sidekiq.

Sidekiq a déjà sa classe ouvrière, mais elle a aussi mis en place la nouvelle classe d'emplois actifs, de sorte qu'elle peut fonctionner dans les deux sens.

cependant, la bonne chose à propos de active job est que vous pouvez changer le gestionnaire d'arrière-plan sans avoir besoin de changer votre code, à condition qu'ils supportent tous les deux les fonctionnalités que vous voulez (par exemple: Gérer les tâches à un moment donné; ayant plusieurs files d'attente de priorité).

rails api guide here qui contient une bonne comparaison pour les gestionnaires qui supportent active job, y compris les fonctionnalités supportées par chaque gestionnaire. Voici le tableau de comparaison si vous êtes trop paresseux pour vérifier le lien:

|                   | 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      |
17
répondu Mohammad AbuShady 2016-10-09 04:02:55

je recommande de rester avec le sidekiq natif pour plus de fonctionnalités. J'ai aussi rencontré des problèmes de sérialisation bizarres avec ActiveJob de temps en temps. ActiveJob, tout en poursuivant un noble objectif de faire respecter L'API unifiée, limite de nombreuses implémentations précisément pour cette raison et offre un petit avantage pour L'instant IMO. Personnellement, je suis plus que désireux de payer le possible prix de réécriture du code à un moment donné dans un futur(ce qui n'arrivera peut-être jamais, vous n'échangerez pas les parties critiques de votre application just for fun-like activerecord vs mongodb) si je décide de changer l'implémentation pour un ensemble de fonctionnalités plus riche.

5
répondu Dr.Strangelove 2016-01-08 11:53:00