Рассмотрим веб-приложение PHP, целью которого является прием пользовательских запросов на запуск общих асинхронных заданий, а затем создание рабочего процесса / потока для выполнения задания. Задания не особенно интенсивны для ЦП или памяти, но ожидается, что они будут довольно часто блокироваться при вызовах ввода-вывода. В секунду следует запускать не более одного или двух заданий, но из-за длительного времени выполнения может одновременно выполняться много заданий.
Поэтому крайне важно, чтобы задания выполнялись параллельно. Кроме того, каждое задание должно контролироваться демоном-менеджером, ответственным за уничтожение зависших рабочих, прерывание рабочих процессов по запросу пользователя и т. Д.
Как лучше всего реализовать такую систему? Я вижу:
- Разветвление работника от менеджера - это вариант самого нижнего уровня, и мне пришлось бы самому внедрять систему мониторинга. Apache - это веб-сервер, поэтому похоже, что этот вариант потребует запуска любых PHP-воркеров через FastCGI.
- Используйте какую-то очередь заданий / сообщений. (gearman, beanstalkd, RabbitMQ и т. д.) - Изначально это казалось очевидным выбором. После некоторого исследования я несколько запутался со всеми вариантами. Например, Gearman выглядит так, как будто он разработан для огромных распределенных систем, где есть фиксированный пул рабочих ... поэтому я не знаю, подходит ли он для того, что мне нужно (один работник на задание).