Можно ли использовать PHP-FPM для управления потребителями очереди?

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

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

Является ли хорошей идеей использовать PHP-FPM для корректировки количества рабочих и экономии оперативной памяти? Готово ли это к производству? Есть ли лучшие решения?

Спасибо

2 ответа

Решение

Я использую систему очередей, которая обрабатывает миллионы сообщений в день. В основном через Amazon SQS, но я также использую новую систему Beanstalkd с более чем 600000 сообщений прямо сейчас.

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

Эти сценарии оболочки запускаются с http://supervisord.org/. Есть еще одно сообщение в блоге об использовании этого также. В настоящее время я выполняю более 800 рабочих сценариев (для нескольких различных типов заданий) на девяти компьютерах, все они извлекают данные из разных очередей и помещают данные в другие очереди, записывая их в базу данных или файлы. Увеличение числа рабочих на машину - это вопрос увеличения числа "numprocs" (или его уже достаточно большого размера), а затем, при необходимости, увеличения количества. Можно также сказать, 5 автозапуска, а затем еще один блок из 50, которые готовы начать при необходимости.

Я считаю, что каждый работник занимает только около 20 МБ общей памяти (остальное является общим для процессов). Конечно, это зависит от задач, которые выполняют рабочие. Изменение размера изображений может занять много усилий. Отчасти по этой причине у меня есть возможность часто перезапускать скрипт PHP.

Всякий раз, когда мне приходилось запускать вещи одновременно (или асинхронно), я отправлял задания рабочим- механикам. У меня обычно было по крайней мере один процесс на ядро ​​процессора на физическую машину.

PHP-FPM - это демон cgi. Таким образом, ваш beanstalkd-процессор будет выполнять множество HTTP-запросов к вашей собственной системе. Те, вероятно, должны пройти через ваш стек http. Не уверен, что это отличная идея.

Вы также можете проверить pcntl_fork, чтобы разделить текущий процесс на несколько одновременно запущенных процессов.

Другие вопросы по тегам