Лучшие практики по структурированию асинхронных почтовых программ (с использованием Sidekiq)

Просто интересно, как лучше всего структурировать асинхронные почтовые программы в моем приложении Rails (используя Sidekiq)? У меня есть один класс ActionMailer с несколькими методами/электронными письмами...

notifier.rb:

class Notifier < ActionMailer::Base
  default from: "\"Company Name\" <[email protected]>"

  default_url_options[:host] = Rails.env.production? ? 'domain.com' : 'localhost:5000'

  def welcome_email(user)
    @user = user
    mail to: @user.email, subject: "Thanks for signing up!"
  end

  ...

  def password_reset(user)
    @user = user
    @edit_password_reset_url = edit_password_reset_url(user.perishable_token)
    mail to: @user.email, subject: "Password Reset"
  end
end

Затем, например, почта password_reset отправляется в моей модели User, выполняя...

user.rb:

def deliver_password_reset_instructions!
  reset_perishable_token!
  NotifierWorker.perform_async(self)
end

notifier_worker.rb:

class NotifierWorker
  include Sidekiq::Worker
  sidekiq_options queue: "mail"

  def perform(user)
    Notifier.password_reset(user).deliver
  end
end

Так что я думаю, мне интересно несколько вещей здесь...

  1. Можно ли определить множество действий «выполнить» в одном работнике? Поступая таким образом, я мог бы упростить задачу (один уведомитель/почтовый работник), поскольку он у меня есть, и отправлять через него много разных электронных писем. Или я должен создать много рабочих? По одному на каждую почтовую программу (например, WelcomeEmailWorker, PasswordResetWorker и т. д.) и просто назначьте им всем использование одной и той же «почтовой» очереди с Sidekiq.
  2. Я знаю, что это работает как есть, но должен ли я разбить каждый из этих почтовых методов (welcome_email, password_reset и т. д.) на отдельные классы почтовых программ, или это нормально, чтобы они все находились в одном классе, таком как Notifier?

Очень ценю любые советы здесь. Спасибо!


person gbdev    schedule 27.10.2013    source источник
comment
Вы можете просто использовать: Notifier.delay.password_reset(user). Не нужно создавать отдельных воркеров. См. здесь: github.com/mperham/sidekiq/wiki/Delayed-Extensions   -  person Damien Roche    schedule 27.10.2013
comment
Блаженство! Это потрясающе. Спасибо за ссылку. Если вы хотите добавить это в качестве ответа, я приму.   -  person gbdev    schedule 27.10.2013


Ответы (2)


Как обсуждалось здесь, Sidekiq поддерживает отложенную почтовую программу по умолчанию, поэтому нет необходимости создать отдельных воркеров:

Notifier.delay.password_reset(user.id)

person Damien Roche    schedule 27.10.2013

Я не уверен, но я думаю, что не стоит передавать экземпляр в действие почтовой программы, если вы используете задержку, поэтому, возможно, лучше изменить приведенный выше код на:

Notifier.delay.password_reset(user.id)
person NoDisplayName    schedule 07.05.2014