Вопрос об управлении очередью заданий для разработчика PHP, впервые знакомого с использованием рабочих процессов - PullRequest
0 голосов
/ 22 сентября 2011

Я пытаюсь создать свое первое PHP-приложение с балансировкой нагрузки, которое использует рабочие процессы / серверы. Я использую cloudcontrol для своего хостинга, поскольку они обеспечивают удобство среды управляемого сервера с помощью сценариев балансировки нагрузки и развертывания, так что я могу сосредоточиться больше на ядре своего приложения, а не на администраторе сервера.

Мое приложение выполняет вызовы API api graph, а также изменяет размеры изображений - трудоемкие операции. Чтобы сократить время отклика, я пытаюсь использовать рабочий надстройку cloudcontrol для выполнения этих трудоемких операций в фоновом режиме. Вызов работника облачного контроля достаточно прост, поскольку CC предоставляет API / SDK для этого:

http://cloudcontrol.com/developers/documentation/add-ons/worker/
https://code.launchpad.net/~cloudcontrol/phpcclib/trunk

Однако, если внешний интерфейс моего приложения будет использовать ajax-опрос (один раз в секунду или около того), чтобы увидеть, завершено ли задание, мой сервер приложений должен иметь доступ к какому-либо выводу работника, чтобы узнать, завершилось ли задание или нет.

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

Вот как я думаю, это будет работать в моем коде на очень высоком уровне: я добавляю задание в свой стек / очередь в моей базе данных, а затем немедленно вызываю рабочий процесс. Мой обычный поток http продолжит работу и вернет вывод пользователю (и останется свободным отвечать на запросы других пользователей) - пока рабочий процесс продолжается в фоновом режиме. Клиент пользователя будет периодически опрашивать мой сервер, чтобы узнать, завершено ли его задание, и рабочий процесс завершится после его завершения.

Из проведенного мною исследования такую ​​структуру / систему массового обслуживания, по-видимому, нелегко построить (обсуждается в первых двух абзацах этого сообщения в блоге). В настоящее время я изучаю mongoqueue , но пока не уверен, что он удовлетворит потребности моего приложения. Мое приложение использует базу данных mysql, и мне интересно, если использование отдельной базы данных MongoDB для очередей заданий предотвратит проблемы с производительностью, изолировав эту задачу от моей обычной базы данных.

Мой реальный вопрос: 1. Является ли путь, по которому я сейчас иду, хорошей идеей, и 2. Существуют ли какие-либо документы / учебные пособия / библиотеки, о которых люди знают, которые могут мне помочь? Спасибо!

1 Ответ

1 голос
/ 11 апреля 2012

Я только что наткнулся на этот пост в блоге, когда исследовал похожую проблему (хотя я использую AWS).

http://www.engineyard.com/blog/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you/

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

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