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
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.
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 |
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.