2013-12-21 2 views
0

Я хочу автоматически отправлять электронные письма в список пользователей из моего приложения Rails. Объем варьируется от действительно нескольких пользователей (5-10) до групп пользователей (50-70). Максимальный размер всех пользователей (в настоящее время 5000).Отправка массовых писем без фоновой работы

Я понял, что отправка электронной почты может блокировать приложение Rails, поэтому отправка электронной почты должна выполняться с помощью системы очередей и фонового задания, например. используя DelayedJob, Resque или Sidekiq.

К сожалению, для такой фоновой работы требуется рабочий процесс на платформе Heroku. И я хочу избежать этого из-за увеличения стоимости (по крайней мере, для начала).

Есть ли альтернативный подход, который я мог бы взять? Например, второе приложение Rails имеет только один рабочий процесс, который обрабатывает только электронную почту (ну, я думаю, это также привело бы к процессу оплачиваемого рабочего процесса)?

Можно ли отправлять массовые электронные письма без такого рабочего процесса через SendGrid, MailGun или любую другую услугу, которая прекрасно сочетается с Heroku?

+2

У ваших контроллеров рельсов есть тайм-аут в героике, вы не можете это сделать – apneadiving

+0

Есть ли способ запустить рабочий дино только тогда, когда есть задание в очереди? Я хочу избегать запуска рабочего диноза, который в 99% случаев не имеет ничего общего. Или это уже сделано автоматически Heroku таким образом? –

+0

Возможно, вам будет полезно https://github.com/phoet/freemium – phoet

ответ

3

Принадлежит к @phoet его ссылке

У нас есть подобная идея работает на Heroku, который мы думали, что будет свободен. Оказывается, они нас счет за scheduler часов ... но вот что мы сделали:


Resque

Resque представляет собой систему массового обслуживания, которая работает на Rails очереди элементов в Redis.Это полностью рекомендуется use this on Heroku, и очень эффективно & масштабируемой

Это работает так:

  1. Отправить "данные" (как правило, идентификаторы) в Resque очередь нужно
  2. Resque отправляет идентификаторы в Redis
  3. Регрессионное задание Resque обрабатывает очередь Redis
  4. Выполнение рассылки при обработке очереди (отправка электронной почты в Mandrill/SendGrid)

Причина, по которой очередь как @apneadiving сказал - ваш контроллер будет тайм-аут и (что более важно), приложение Rails зависнет, пока процесс не будет завершен

Там есть очень хороший Railscast на Resque here:

enter image description here


Код

Это просто базовый код - может добавить больше, если вы хотите:

#app/controllers/messages_controller.rb 
    def send_message 
     id = params[:id] 
     message = Message.find(id).broadcast! 

     flash[:notice] = "Broadcast Queued!" 
     redirect_to root_path 
    end 

    #app/models/message.rb 
    def broadcast! 
     self.subscribers.each do |subscriber| 
      Resque.enqueue(MailoutQueue, id, subscriber.id, queue.id) 
     end 
    end 

    #app/workers/mailout_queue.rb 
    class MailoutQueue 
     @queue = :mailer 
     def self.perform(message_id, recipient_id, queue_id) 
       MessageMailer.send_message(message_id, recipient_id).deliver 
     end 
    end 

class MessageMailer < ActionMailer::Base 
     default from: '****************' 

     def send_message(message_id, subscriber_id) 

       #Declarations 
       @message = Message.find(message_id) 
       @subscriber = Subscriber.find(subscriber_id) 

       #Send 
       mail(:to => @subscriber.email, :subject => @message.title) 

     end   

end 
+0

Спасибо за подробные объяснения по Resque. Тем не менее, я выбрал DelayedJob на данный момент, так как нашел решение для автоматического масштабирования рабочих процессов на Heroku с использованием безотходного драгоценного камня (https://github.com/lostboy/workless). @apneadiving предложила драгоценный камень rentfire (https://github.com/meskyanichi/hirefire), который также будет работать с Resque, однако сам камень больше не поддерживается, и я не мог заставить его работать должным образом с моей настройкой Rails. Существует платная услуга за ~ 10 $/месяц/приложение, которое должно действительно работать. Я могу только рекомендовать пойти на решение для автоматического масштабирования, чтобы сэкономить средства. –

+0

Нет проблем! Вы должны помнить, что DelayedJob полагается на ActiveRecord и, следовательно, может обрабатывать значительно меньшее количество объектов, чем Resque.IMO, Resque & Redis - безусловно наиболее масштабируемое решение для массового обслуживания, но если вы его работаете с ди-джеем, это тоже абсолютно здорово! –

+0

Я полностью понимаю, что DelayedJob медленнее, чем Resque из-за различий Redis и ActiveRecord. Если вы найдете какое-либо решение, которое работает для автоматического масштабирования рабочих процессов Resque на Heroku, мне также было бы интересно. –

Смежные вопросы