2013-10-27 6 views
2

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

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?

Действительно оцените любой совет здесь. Благодаря!

+0

вы можете просто использовать: 'Notifier.delay.password_reset (пользователь)'. Не нужно создавать отдельных работников. См. Здесь: https://github.com/mperham/sidekiq/wiki/Delayed-Extensions –

+0

Bliss! Это потрясающе. Спасибо за ссылку. Если вы хотите добавить это в качестве ответа, я соглашусь. – gbdev

ответ

3

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

Notifier.delay.password_reset(user.id)

2

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

Notifier.delay.password_reset(user.id) 
Смежные вопросы