Pull to refresh

Использование RabbitMQ вместе с MonsterMQ часть 1

Reading time4 min
Views4.3K
Эта статья рассчитана на тех, кто ещё не знаком с очередями и RabbitMQ. Тем, кто уже знает как работать с RabbitMQ и хочет только изучить возможности, которые предоставляет MonsterMQ, я рекомендую посетить страницу проекта на github.com, где в описании подробно описано как можно использовать MonsterMQ без описания основ работы с RabbitMQ. Далее в этой статье будут рассмотрены основы работы RabbitMQ вместе с MonsterMQ.

Оглавление всех частей:
Часть 1
Часть 2
Часть 3
Часть 4
Часть 5

RabbitMQ — это брокер сообщений. Он принимает, хранит и пересылает сообщения своим клиентам. Клиентами отправителями и получателями сообщений могут служить, например, приложения написанные на PHP. Общение между клиентом и RabbitMQ происходит по определённым правилам, называемым AMQP (Advanced Message Queuing Protocol). Например общение между вашим браузером и веб-сервером, на котором находится эта статья, тоже происходит по определённым правилам, они называются HTTP (HyperText Transfer Protocol) — протокол передачи гипертекста. И HTTP, и AMQP являются клиент-серверными протоколами, то есть подразумевают наличие клиента и сервера. RabbitMQ является AMQP-сервером, а MonsterMQ является библиотекой, позволяющей быстро написать AMQP-клиент на PHP, который будет общаться с AMQP-сервером.

AMQP и RabbitMQ используют следующие термины:

Producing — значит посылать сообщения, Producer(поставщик) — тот, кто посылает сообщения.

image

Consuming — значит принимать сообщения. Consumer(потребитель) — тот, кто принимает сообщения.

image

Queue — очередь. Прежде чем попасть к потребителю и после того как было отправлено поставщиком, сообщение храниться в очереди, внутри RabbitMQ. Очередь представляет из себя буфер, хранящий сообщения. Многие поставщики могут слать сообщения в одну очередь, и многие потребители могут читать сообщения из одной очереди.

image

Заметьте, что поставщик, потребитель и брокер не обязательно должны находиться на одном хосте, наоборот они обычно расположены на разных.

Hello world


Далее в этой статье мы напишем две программы на PHP, используя библиотеку MonsterMQ, одна из которых будет отправлять сообщения, а другая получать и выводить их в консоль. На рисунке ниже «P» — поставщик, «C» — это потребитель, красные квадратики — это очередь, которая является буфером сообщений(каждый квадратик — это сообщение).

image
(Изображение взято с официального сайта RabbitMQ)

Для дальнейшей работы нам понадобиться установить MonsterMQ, чтобы это сделать введите в консоль следующую команду:

composer require goootlib/monster-mq:dev-master

(Больше об установке MonsterMQ можно найти на странице проекта на github.com)
Эта команда установит MonsterMQ в текущую папку.

Отправление


Мы назовём нашего отправителя сообщений send.php, а получателя сообщений receive.php. Отправитель будет присоединяться к серверу и отсылать сообщение.
Чтобы присоединиться к серверу напишем следующий код в send.php:.

try {
   $producer = \MonsterMQ\Client\Producer();

   $producer->connect('127.0.0.1', 5672);
   $producer->logIn('guest', 'guest');
} catch(\Exception $e) {
   var_dump($e);
}

В этом коде мы присоединяемся к RabbitMQ, работающему на локальном сервере, на стандартном порте. Укажите другие ip-адрес и порт, если RabbitMQ запущен у вас на другом адресе. После соединения мы также вызываем метод logIn(), который начинает сессию со стандартным логином и паролем. Если у вас в RabbitMQ настроена учётная запись с другим логином и паролем, укажите их здесь.

Чтобы отправить сообщение мы должны объявить очередь, в которую оно будет сначала помещено. После того как очередь объявлена мы можем отправить сообщение:

try {
   $producer = \MonsterMQ\Client\Producer();

   $producer->connect('127.0.0.1', 5672);
   $producer->logIn('guest', 'guest');

   $producer->queue('test-queue')->declare();
   $producer->publish('my-message', 'test-queue');
} catch(\Exception $e) {
   var_dump($e);
}

Объявление очереди идемпотентно, то есть оно не создаст и не изменит очередь, если она уже есть. После мы завершаем сессию и соединение.

try {
   $producer = \MonsterMQ\Client\Producer();

   $producer->connect('127.0.0.1', 5672);
   $producer->logIn('guest', 'guest');

   $producer->queue('test-queue')->declare();
   $producer->publish('Test message', 'test-queue');

   $producer->disconnect();
} catch(\Exception $e) {
   var_dump($e);
}

Приём сообщения


В отличие от отправителя, получатель будет оставаться запущенным, для того чтобы слушать входящие сообщения. В коде receive.php сначала нужно сделать то же, что и в send.php:

try {
   $consumer = \MonsterMQ\Client\Consumer();

   $consumer->connect('127.0.0.1', 5672);
   $consumer->logIn('guest', 'guest');

   $consumer->queue('test-queue')->declare();
} catch(\Exception $e) {
   var_dump($e);
}

Заметьте что в receive.php мы также объявляем нашу очередь, это сделано для того, чтобы получатель объявил очередь, если будет запущен перед отправителем.
Для того чтобы сказать серверу, что мы хотим принять от него сообщение, а также для того, чтобы запустить цикл, который будет ждать и обрабатывать входящие сообщения напишем следующий код:

try {
   $consumer = \MonsterMQ\Client\Consumer();

   $consumer->connect('127.0.0.1', 5672);
   $consumer->logIn('guest', 'guest');

   $consumer->queue('test-queue')->declare();

   $consumer->consume('test-queue');

   $consumer->wait(function ($message, $channelNumber) use ($consumer){
      echo "Message - {$message} received on channel {$channelNumber}";
   });
} catch(\Exception $e) {
   var_dump($e);
}

Запуск


Теперь мы можем запустить оба скрипта, как получателя:

php receive.php

так и отправителя:

php send.php

Получатель выведет в консоль сообщение, которое он получит от RabbitMQ (который в свою очередь получит его от send.php) и использовавшийся номер канала. Он будет выполняться и далее пока вы не закроете терминал, или пока не прекратите его выполнение нажав Ctrl+C. Запуская отправителя в другом терминале, вы сможете пронаблюдать, как сообщения доставляются получателю и выводятся в консоль.

Если вы хотите посмотреть какие, в настоящий момент, RabbitMQ содержит очереди и сколько в них сообщений, вы можете сделать это, как привилегированный пользователь, используя rabbitmqctl
sudo rabbitmqctl list_queues


На windows не используйте sudo
rabbitmqctl.bat list_queues


Теперь мы готовы к тому, чтобы перейти к следующей части наших уроков.
Tags:
Hubs:
Total votes 10: ↑8 and ↓2+6
Comments3

Articles