Электронная почта пользователей через приложение RoR

Я нахожусь на завершающем этапе создания приложения для форума / сообщества вопросов и ответов, и я хотел бы добавить уведомления по электронной почте. Приложение имеет несколько различных сущностей, в том числе темы, вопросы, проекты, фотографии и т. Д. Цель состоит в том, чтобы пользователь мог «подписаться» на любое количество этих сущностей, создавая очередь электронной почты всякий раз, когда сущность получает новые комментарии или действия. Эта функция очень похожа на facebook и форумы.

Я изучал ActionMailer (с задачами с граблями и отложенными заданиями), MailChimp API (и плагины) и другие почтовые программы приложений (PostageApp и Postmark).

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

Другая сложность заключается в том, что будут разные типы подписок (мгновенное уведомление по электронной почте, ежедневное уведомление по электронной почте) в зависимости от предпочтений пользователя.

Как лучше всего управлять электронной почтой для таких функций? Любые советы / идеи приветствуются!


person aguynamedloren    schedule 14.04.2011    source источник


Ответы (2)


Вы можете использовать ActionMailer для отправки с помощью SendGrid или Postmark. PostageApp по-прежнему нуждается в SMTP-сервере и добавляет дополнительную зависимость, но это может быть неплохо. Я считаю, что MailChimp предназначен только для информационных бюллетеней, так что это, вероятно, не так много для вас здесь.

Приводя здесь общий обзор, важно отметить несколько вещей:

  1. Держите логику почтовой программы от загромождения контроллеров.
  2. Предотвратить откладывание ответов на запросы пользователей.
  3. Избегайте проблем с «перегрузкой приложения».
  4. Обработка событийных и периодических электронных писем.

Для адреса №1 вы захотите использовать Observer, чтобы решить, когда отправлять электронное письмо на основе событий. Чтобы учесть № 2 и № 3, вы можете добавить DelayedJob, чтобы электронные письма отправлялись в фоновом режиме. Вы можете довольно легко использовать SendGrid с ActionMailer на Heroku (особенно если вы зайдете в Pony). Для №4 вы должны просто создать задачу rake, которая обрабатывает бизнес-логику решения, кому отправлять электронную почту, и ставит в очередь задания отправки, как задачи DJ, как это сделал бы Observer.

И для ясности: DelayedJob будет выполнять задания в отдельном процессе. В случае Heroku вы фактически запускаете каждого воркера DelayedJob в другом Dyno, который представляет собой полностью отдельный стек / среду (вполне вероятно, на другом физическом сервере). Не будет никаких проблем с перегрузкой вашего приложения таким образом, если, конечно, ваша база данных не сможет справиться с добавлением заданий (в этом случае вы можете вместо этого использовать Redis в качестве магазина DJ). Вы можете легко масштабироваться по горизонтали, добавляя больше ди-джеев по мере необходимости.

person coreyward    schedule 14.04.2011

Взгляните на SimpleWorker, облачную фоновую обработку / рабочую очередь.

Это надстройка для Heroku, которая может масштабироваться и расширяться для обработки набора разовых публикаций или запланированных электронных писем. (Например, главное задание можно запланировать, а затем, когда оно выходит из расписания для выполнения, оно ставит в очередь 10, 100, 1000 заданий для одновременного выполнения в масштабируемой инфраструктуре.)

Рабочие Heroku могут работать нормально, поскольку они будут работать как отдельные процессы, но если у вас переменная нагрузка, тогда вам нужна служба, которая может увеличиваться и уменьшаться в зависимости от заданий - так что вы: а) не платите за неиспользованную мощность и б ) может обрабатывать пакетный трафик и пакетный вывод.

(Раскрытие информации: я работаю в компании.)

person frommww    schedule 22.04.2011