Рельсы: сталкер, спасатель или что-то еще - PullRequest
2 голосов
/ 22 июля 2011

Актуальная проблема

Я использую Rails 3.0.4 и MongoDB через mongoid.

Я использую @ mailgun для доставки своих электронных писем. Я отправляю как массовые (например, новостные письма), так и транзакционные (например, активировать аккаунт, забыл пароль) электронные письма. Прямо сейчас я использую один домен (переводится в одну очередь на конце почтового пистолета) для доставки этих писем. Проблема возникает, когда у меня в очереди уже много массовых писем, и кто-то регистрирует или запрашивает новый пароль. Я хочу, чтобы транзакционные электронные письма доставлялись до массовых рассылок, но очередь почтового ящика работает на основе FIFO.

Я подумал, что для смягчения этой проблемы можно использовать разные домены (следовательно, разные очереди, которые могут обрабатываться одновременно) для массовой и транзакционной почты. В rails настройки smtp - это настройки уровня приложения, а не настройки уровня запроса. Итак, я решил, что буду использовать разные среды для разных настроек SMTP.

У меня также есть система очередей для писем, и я использую delayed_job , чтобы справиться с этим. Я не могу найти способ разграничить массовую и транзакционную почту в delayed_job. Итак, я решил переместить мою систему очередей в Rescue + Redis или Beanstalked + Stalker, где я могу помечать очереди и просить работника обрабатывать только определенную очередь.

Вопрос

Я хочу что-то более простое в обслуживании, наименее ресурсоемкое и хорошо масштабируемое.

  • С delayed_job мне не нужно запускать какой-либо другой сервер и контролировать его.
  • Для delayed_job я использовал ломтик 256 МБ на стоечном пространстве, но для redis и stalker потребовался бы другой сервер, либо resque, либо beanstalkd.
  • Я понятия не имею о масштабировании, но уже 2 месяца с момента запуска моего приложения, и я уже отправил 30 000+ писем.

Если есть какие-либо альтернативы портированию с delayed_job на redis или stalker, пожалуйста, дайте мне знать.

Обновление:

Похоже, delayed_job также имеет поддержку именованных очередей, но это пока не задокументировано. Открыв тикет для добавления документации, буду обновлять детали, как только я знаю, как ими пользоваться:)

1 Ответ

2 голосов
/ 22 июля 2011

Отложенное задание принимает необязательный параметр приоритета (поясняется ближе к концу связанной страницы).

Например:

Delayed::Job.enqueue(MailingJob.new(params[:id]), 3)

... где 3 является приоритетом.

Итак, когда вы ставите в очередь свою массовую не указывайте приоритет , а при постановке в очередь ваши транзакционные электронные письма дают им что-то более высокое.Таким образом, ваши транзакционные электронные письма будут поступать в очередь @mailgun раньше всего, что еще не находится на выходе.

Если ваш исходящий SMTP-сервер не имеет какое-либо медленное соединение, он, вероятно, отправитнесколько сотен электронных писем в минуту, так что я бы не стал слишком беспокоиться, если, например, 200 почтовых рассылок уже переданы @mailgun, и вы ждете транзакционного электронного письма;он все еще будет отправлен вскоре после этого.

...