Асинхронная обработка или очереди сообщений в PHP (CakePHP)

Я создаю веб-сайт в CakePHP, который обрабатывает файлы, загруженные с помощью API XML-RPC и, несмотря на веб-интерфейс. Файлы должны быть проверены ClamAV, необходимо создать эскизы и т. Д. Вся ресурсоемкая работа, требующая времени, для которого пользователю не нужно ждать. Итак, я рассматриваю асинхронную обработку с PHP в целом и CakePHP в частности.

Я наткнулся на плагин MultiTask для CakePHP, который выглядит многообещающим. Я также сталкивался с различными реализациями очереди сообщений, такими как dropr и beanstalkd . Конечно, мне также понадобится какой-то фоновый процесс, возможно, реализованный с использованием Cake Shell. Я видел MultiTask с помощью PHP_Fork для реализации многопоточного PHP-демона.

Мне нужен совет, как наилучшим образом подобрать все эти штуки.

  • Это хорошая идея иметь давнего демона, написанного на PHP? О чем я должен следить?
  • В чем преимущество реализации внешних очередей сообщений? Плагин MultiTask не использует внешнюю очередь сообщений. Он загружает его самостоятельно, используя таблицу MySQL для хранения задач.
  • Какую очередь сообщений я должен использовать? dropr? beanstalkd? Что-то другое?
  • Как я должен реализовать серверный процессор? Является ли PHP-демоник forking хорошей идеей или просто спрашивает о проблемах?

Мой текущий план – либо использовать плагин MultiTask, либо отредактировать его, чтобы использовать beanstald вместо собственной реализации таблицы MySQL. Задания в очереди могут состоять только из имени задачи и массива параметров. Демон PHP будет следить за входящими заданиями и передавать их одному из своих дочерних потоков. Он просто выполнил бы задачу CakePHP с заданными параметрами.

Любое мнение, советы, комментарии, gotchas или пламя на этом?

У меня были отличные результаты с BeanstalkD и фоновым контентом, написанным на PHP, чтобы получить задания, а затем действовать на них. Я завернул фактический запуск работы в bash-скрипте, чтобы продолжать работать, даже если он вышел (если я не сделаю « exit(UNIQNUM); », когда скрипт проверяет его и фактически выйдет). Таким образом, перезапущенный скрипт PHP очищает любую память, которая может быть использована, и может запускаться заново каждые 25/50/100 заданий, которые она запускает.

Несколько преимуществ использования этого – вы можете установить приоритеты и задержки в задание BeanstalkD – «запустите это с меньшим приоритетом, но не начинайте в течение 10 секунд». Я также поставил несколько заданий в определенное время (запустите это сейчас, через 5 секунд и снова через 30 секунд).

При соответствующей конфигурации сети (и ее запуске на доступном IP-адресе к остальной части вашей сети) вы также можете запустить beanstalkd deamon на одном сервере и опросить его с нескольких других компьютеров, поэтому, если есть большой количество создаваемых задач, работа может быть разделена между серверами. Если конкретный набор задач нужно запускать на определенной машине, я создал «трубку», которая является именем хоста машины, которое должно быть уникальным в нашем кластере, если не глобально (полезно для загрузки файлов). Я нашел, что он отлично работает для изменения размера изображения, часто возвращая готовые меньшие изображения в файловую систему до того, как сама веб-страница, которая будет ссылаться на нее, будет ссылаться на URL-адрес, к которому он будет поступать.

На самом деле я собираюсь начать серию статей по этой теме для моего блога (включая некоторые методы для кода, которые я уже проталкивал несколькими миллионами живых запросов). Мой URL-адрес связан с моим профилем пользователя здесь, на Stackoverflow ,

(Я написал серию статей по теме Beanstalkd и очередности работы)

Если вы используете очередь сообщений, например beanstalkd, вы можете запустить столько процессов, сколько захотите (даже на одном сервере). Каждый рабочий процесс займет одно задание из очереди и обработает его. Вы можете добавить больше рабочих и больше серверов, если вам нужно больше возможностей.

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

Возможно также стоит проверить Amazon SQS, который будет использоваться вместе с EC2?

Как насчет Гирмана? Хорошая поддержка и интеграция в php и функции, такие как параллельная задача, масштабирование, мониторинг и так далее …