Gearman — это менеджер очередей для синхронного и асинхронного выполнения задач. Читал о нем давно, но сегодня посчасливилось с ним познакомится более тесно 🙂
Приложение написано на PHP и имеет свои нюансы, поэтому я не буду приводить код и посоветую ознакомится с базовой реализацией из доков.
Установка Gearman и модуля для PHP
Первым делом поставим сам Gearman и модуль для PHP. Установка достаточно простая:
# apt-get install gearman php5-gearman
На этом было бы всё, если бы не одно НО…
Supervisord
Gearman получает задания от клиента и передает в работу воркеру, который должен постоянно работать и проверять есть ли что-то в очереди на выполнение. Воркер у меня на PHP, значит нужно заставить сркипт работать в фоновом режиме постоянно.
Одним из вариантов решения данной задачи является Supervisord. Поставим его и настроим наш воркер. Оговорюсь наперед, что по заданию у меня должен работать один воркер и обрабатывать очередь синхронно (по очереди).
Поставим его на сервер:
# apt-get install supervisor
Теперь создадим настройки для управления нашим воркером:
# nano /etc/supervisor/conf.d/bot_worker.conf
Вставим такой конфиг:
[program:bot_worker] command=/usr/bin/php /home/www/workers/bot_worker.php numprocs=1 directory=/home/www/workers/ stdout_logfile=/var/log/bot_worker.log autostart=true autorestart=true user=root stopsignal=KILL
Теперь осталось только перезапустить:
# service supervisor restart
Gearman Monitor
Если есть желание просмотративать состояние серверов и очереди, то можно поставить веб-морду Gearman Monitor. Процедура простая и скучновата: настроить хост на веб-сервере, скачать последнюю версию с GitHub и выдать права. Еще нужно в файле _config.php указать к каким серверам хотим подключатся и смотреть статистику.
Когда откроете страницу первый раз, то веб-морда запросит дополнительный pear-пакет Net_Gearman. Поставим его:
# apt-get install php-pear # pear install Net_Gearman-0.2.3
Теперь можно переходить на ссылку и наблюдать чем занимается Gearman, какие воркеры работают и что лежит в очередях.
Успехов! 🙂