Иногда в веб-приложениях появляется необходимость выполнить сложные ресурсоемкие задачи, которые не могут быть умещены в коротком временном интервале HTTP запроса. В этом случае на помощь приходят очереди. Основная идея очередей - избежать выполнения ресурсоемких задач непосредственно после отправки запроса. Вместо этого задача ставится в очередь для последующего выполнения в асинхронном режиме. Т.е. при получении запроса от клиента мы инкапсулируем задачу как сообщение и отправляем его в очередь, а уже обработчик очереди достает сообщения в порядке их следования и обрабатывает надлежащим образом. Забегая вперед, скажу, что возможен режим работы очередей, когда при наличии нескольких копий обработчика, следующая задач будет поступать на свободный обработчик. Таким образом достигается распараллеливание выполнения задач.
В данном разделе рассматривается работа с очередями, использующими сервер сообщений RabbitMQ. Сервер RabbitMQ по сути является менеджером очередей, который имеет следующие преимущества:
- в случае некорректного завершения работы сервера, данные в очереди не теряются. И при последующем запуске обработка продолжается с того места, где был обрыв;
- распределить задачи на несколько очередей, т.е. создать распараллеливание на уровне сообщений
- если результат обработки не удовлетворяет, задачу можно послать в очередь повторно;
- существует несколько режимов работы очереди: рассылка типа точка-точка(direct), рассылка сообщений по шаблону(topic), широковещательная рассылка сообщений(fanout);
- возможность синхронизировать работу клиента и сервера, своего рода реализация RPC
- количество хранимых в очереди сообщений неограничено
- сервер сообщений может быть расположен удаленно как по отношению к продюсеру, так и по отношению к консьюмеру.
В туториалах будут приведены примеры для всех вышеперечисленных вариантов. За основу взяты туториалы с
официального сайта, дополнены и реализованы на PHP для RabbitMQ v2.5.
RabbitMQ испозует протокол AMQP. Чтобы использовть RabbitMQ необходимо поставить клиентскую и серверную части.
Установка клиента
Для выполнения установки в системе должны быть установлены следующие пакеты
- git (aptitude install git-core)
- dh-autoreconf (aptitude install dh-autoreconf)
- php-pear (aptitude install php-pear)
- phpize (aptitude install php5-dev)
- python2.6 (aptitude install python2.6)
Для установки расширения AMQP для PHP необходимо сначала установить клиентскую библиотеку rabbitmq-c версии 0-9-1, собранную с rabbitmq-codegen, которая соответствует используемой версии брокера. Для этого необходимо выполнить следующие шаги
# Загрузка библиотеки rabbitmq-c версии 0-9-1
$ git clone https://github.com/alanxz/rabbitmq-c
$ cd rabbitmq-c/codegen
$ git clone https://github.com/rabbitmq/rabbitmq-codegen.git ./
$ cd ..
# Конфигурирование, сборка и установка
$ autoreconf -i && ./configure && make && sudo make install
После чего необходимо установить php расширение для работы с этой библиотекой. Расширение можно установить
отсюда командой
$ pear install http://pecl.php.net/get/amqp-1.0.7.tgz
После этого в папке, содержащей модули PHP(для PHP5.3 это папка /usr/lib/php5/20090626), появится модуль amqp.so. Это расширение подключается в PHP путем прописания в файле /etc/php5/conf.d/amqp.ini строки
extension=amqp.so
и перезагрузить веб сервер. Для апача это можно сделать командой
$ service apache2 restart
Установка сервера
Для версии клиента rabbitmq-с 0-9-1 необходим сервер версии >2.5. Пользователи Ubuntu >11.04 могут воспользоваться командой
$ aptitude install rabbitmq-server
В репозитории Debian и Ubuntu более ранних версий включен серевер очередей версии <2.5. Поэтому пользователям этих систем необходимо установить библиотеку erlang-nox, после чего скачать с официального сайта
сервер RabbitMQ и установить его
$ aptitude install erlang-nox
$ wget http://www.rabbitmq.com/releases/rabbitmq-server/v2.8.7/rabbitmq-server_2.8.7-1_all.deb
$ dpkg -i rabbitmq-server_2.8.7-1_all.deb
Также различные версии серверов сообщений можно найти
здесь.