Лучший способ динамически планировать отправку напоминаний по электронной почте? Что-нибудь лучше, чем cron?


Приветствую, я разрабатываю веб-приложение. Одна его часть позволит пользователям планировать отправку "напоминания" по электронной почте в определенное время суток. Каков наилучший способ добиться этого? В принципе, все решения, которые я придумал, работают по шаблону "опроса", когда мне нужен шаблон "прерывания".

Вот несколько возможных решений, которые я придумал:

  1. Каждую минуту устраивайте пожар на работе. Запускаемый сценарий проверяет базу данных, чтобы узнать, есть какие-либо электронные письма для отправки, если они есть, он отправляет их, иначе он снова засыпает. Недостатком этого является то, что каждую минуту возникают небольшие накладные расходы. Кроме того, это может быть не масштабируемая система, особенно когда число пользователей становится настолько большим, что для отправки всех электронных писем может потребоваться более минуты.

  2. То же, что и № 1, но задание срабатывает только каждые 15 минут. Это немного более управляемо, но не идеально, так как ограничивает пользователей напоминаниями о 15-минутных отметках, и это все еще сопряжено с небольшими накладными расходами, когда нет электронных писем для отправки. Неплохо, но и не идеально.

  3. У PHP exec() есть немного кода, который динамически изменяет crontab или планирует задание "at" в базовом linux. Это дало бы мне гибкость и модель типа "прерывание", которой я так жажду, но открыло бы огромную дыру в безопасности, позволив PHP выполнять() код linux. Итак, я собираюсь пойти дальше и исключить этот вариант.

Итак, что-нибудь лучше того, что я придумал с кем? Возможно, есть способ запланировать отправку электронной почты без использования cron? Мне очень любопытно посмотреть, что вы, ребята, скажете по этому поводу:).

Author: Keenahn Jung, 2011-06-08

5 answers

Используйте первый вариант.

Для отправки всех электронных писем может потребоваться более минуты

  1. Проверьте, существует ли файл_('mailing.q'); Если он все еще существует - прекратите выполнение.
  2. Создайте файловую рассылку.вопрос
  3. отправлять электронные письма
  4. разорвать связь ('рассылка.q');

И не думайте о накладных расходах - не в этом случае.

 2
Author: OZ_, 2011-06-08 00:49:38

У вас может быть PHP-скрипт, который остается запущенным. Каждый установленный интервал запрашивайте в базе данных электронные письма, которые необходимо отправить в следующем интервале. Разбейте это на массив с одной группой на каждую минуту. Поэтому, если вы выберете 15 минут, у вас будет массив из 15 записей, в каждой из которых будут все электронные письма, которые необходимо отправить в это время.

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

В двух словах, один процесс управляет очередью и разветвляет другие процессы для обработки отправки. Когда очередь "пуста", она становится больше. Вы могли бы периодически запускать cron, чтобы убедиться, что процесс не прекратился.

 3
Author: Brent Baisley, 2011-06-08 01:14:59

Нет ничего особенно плохого в использовании cron в вариантах № 1 и № 2, я не знаю, какое приложение вы используете, но предоставление пользователям возможности планировать с точностью до минуты может не потребоваться. Даже в этом случае, вероятно, не будет проблемой, если ваш скрипт помечает статус напоминания как "ожидающий" или такой, и любые новые экземпляры скрипта отправляют только те, которые не являются "ожидающими" или "отправленными".

Вы можете использовать Hudson или аналогичное приложение, которое могло бы помочь со сценарием управление и позволит вам следить за сбоями и т.д. Он может даже рассылать уведомления о сбоях. Он поддерживает собственную систему cron на основе java.

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

 2
Author: ldg, 2011-06-08 00:53:47

Не путайте постановку в очередь почты для отправки и фактическую отправку почты.

Вашему почтовому серверу может потребоваться пятнадцать минут для отправки одного электронного письма. Но для отправки почтового сообщения в очередь требуется только mail(1) 0.036s.

И даже если вам придется отправлять более 1600 электронных писем в минуту (хорошая работа!) вы могли бы немного изменить свой код, чтобы начать отправлять электронные письма с напоминаниями вероятностно несколькими минутами раньше, в ожидании "всплески" - скажем, заглядывая в свою базу данных на пять минут вперед, чтобы увидеть, нужно ли доставлять более 1000 писем, и начинайте ставить их в очередь с 1/5-й вероятностью, 1/4-й вероятностью, 1/3 вероятностью, 1/2 вероятностью, затем ставьте в очередь остатки.

 1
Author: sarnold, 2011-06-08 01:11:42

Существует команда hostman, которая позволяет вызывать функцию в определенное время. Это должно делать то, что вы хотите.


Это было мое первоначальное предложение:

Как насчет комбинации?

  1. Запускайте задание cron один раз в .
  2. Попросите его заполнить файл меткой времени => списком, отражающим, есть ли электронное письмо до + .
  3. Запускайте второй cron каждую минуту, если время указано в файле списка рассылки, затем запустите сценарий отправки электронной почты.
 0
Author: cwallenpoole, 2011-06-08 00:49:03