Очередь заданий - будет ли работать cron? - PullRequest
0 голосов
/ 13 октября 2011

Я создаю небольшое приложение, которое требует, чтобы люди загружали изображения по электронной почте. Он построен на PHP (без фреймворка) с MySQL и S3.

Пока в моем сценарии: электронные письма хранятся в учетной записи POP3. Сценарий запускается каждую минуту, выбирает самое старое письмо, изменяет размер изображения, загружает его на S3, сохраняет свой путь в БД, удаляет письмо.

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

Возможно, мне следует использовать файл .forward для обработки электронной почты, но, опять же, я не буду контролировать поток.

Я считаю, что большинство этих сценариев работают, мне просто любопытно узнать о передовых практиках.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Немного модифицированный подход может быть:

  • Запускать свой скрипт из cron каждую минуту
  • Ваш скрипт проверяет, не запущен ли еще один экземпляр, и если это так, то просто существует
  • Запущенный сценарий обрабатывает оставшуюся очередь до тех пор, пока она не станет пустой или количество элементов (например, не более 10)

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

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

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

1 голос
/ 13 октября 2011

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

Если у вас есть проблемы со стабильностью, вы всегда можете использовать что-то вроде supervise .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...