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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

  1. Попросите выполнить задание cron после <timespan>.
  2. Попросите его заполнить файл списком timestamp =>, отражающим наличие электронной почты до <текущего времени> + <timespan>.
  3. Проведите второй cron каждый раз, если время найдено в файле списка электронной почты, затем запустите сценарий отправки электронной почты.