Il s'agit de mes premiers travaux de traitement de manière asynchrone. J'implémente Sidekiq pour le traitement en arrière-plan dans mon application. Je vais l'utiliser pour des e-mails de rappel et des notifications dans l'application. Je ne sais pas si je dois utiliser Active Job pour créer un travail qui envoie un e-mail ou un Sidekiq Worker pour envoyer un e-mail. Ils semblent faire la même chose et Rails 4.2 Le travail actif semble très nouveau… remplace-t-il le besoin d'un Sidekiq Worker?
Vous trouverez ci-dessous la même chose en envoyant un code de messagerie à l'aide d'une tâche Active Job et d'un Sidekiq Worker. J'utilise Whenever gem pour la planification.
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
tilisation d'un "Worker" 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
tilisation d'un travail actif "Travail"
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 planificateur Everyever 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
En bref, c'est la même chose. ActiveJob l'appelle un Job tandis que Sidekiq l'appelle un Worker. J'ai décidé de garder la terminologie différente afin que les gens puissent distinguer les deux.
Vous pouvez utiliser l'un ou l'autre. Notez qu'ActiveJob ne donne pas accès à l'ensemble complet des options Sidekiq, donc si vous souhaitez personnaliser les options de votre travail, vous devrez peut-être en faire un Worker.
Rails 4.2 a ajouté ActiveJob
pour unifier l'API des 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 de travailleurs, mais il a également mis en œuvre la nouvelle classe d'emplois active, afin qu'elle puisse fonctionner dans les deux sens.
Cependant, la bonne chose à propos du travail actif est que vous pouvez changer le gestionnaire d'arrière-plan sans avoir besoin de changer votre code, à condition qu'ils prennent tous les deux en charge les fonctionnalités que vous souhaitez (par exemple: gérer les travaux à un certain moment; avoir plusieurs files d'attente prioritaires).
Il y a un guide Rails api ici qui contient une bonne comparaison pour les gestionnaires qui prennent en charge le travail actif, y compris les fonctionnalités prises en charge de 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 recommanderais de rester avec sidekiq natif pour plus de fonctionnalités. J'ai également rencontré de temps en temps des problèmes de sérialisation étranges avec ActiveJob. ActiveJob, tout en poursuivant un noble objectif d'appliquer l'API unifiée, limite précisément de nombreuses implémentations pour cette raison et offre un petit avantage pour le moment à l'OMI. Personnellement, je suis plus que désireux de payer le prix possible de la réécriture du code dans le futur (ce qui peut ne jamais arriver, vous n'échangez pas les parties critiques de votre application juste pour le plaisir - comme activerecord vs mongodb) si je décide d'échanger l'implémentation pour un ensemble de fonctionnalités plus riche.
Selon la documentation, l'utilisation de Sidekiq :: Worker par rapport à ActiveJob peut présenter des avantages en termes de performances.
https://github.com/mperham/sidekiq/wiki/Active-Job#performance