Введение

Иногда в веб-приложениях появляется необходимость выполнить сложные ресурсоемкие задачи, которые не могут быть умещены в коротком временном интервале 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

Также различные версии серверов сообщений можно найти здесь.

Добавить комментарий

Ваше имя

Сообщение

Подтверждение