RabbitMQ

MQ само название указывает на стандарт известный как протокол Advanced Message Queuing. Его предназначение работать как посредник между производителем (отправитель) и потребителем (получатель) — он просто принимает и отправляет сообщения. Общие аналогии RabbitMQ с открытым исходным кодом, который выполняет доставку, как почтовое отделение написанное на Erlang. Вы посылаете пакет данных для вашего друга из любой части мира и ваш друг получает этот пакет не зная как он к нему попал.

Оглавление:
  1. Установка RabbitMQ
  2. Queues и Exchanges
  3. Производитель и потребитель
  4. Заключение

Установка RabbitMQ

На странице rabbitmq.com / download.html выберите файл установки который подходит для вашей системы. С Ubuntu случались проблемы при установке пакета.

После установки, есть инструмент установки плагина доступа называется rabbitmq-plugins. В качестве дополнительного шага, вы можете установить плагин rabbitmq_management, который предоставит просмотр сервера с веб-браузера и будет легче делать различные задачи monitoring/management. Чтобы установить плагин на Ubuntu, набираем:

sudo rabbitmq-plugins enable rabbitmq_management

Перезапустите сервер RabbitMQ что бы изменения вступили в силу:

sudo /etc/init.d/rabbitmq-server restart

Укажите ваш браузер http://localhost:55672/mgmt/ для веб-интерфейса. Пользователь по умолчанию будет с логином и паролем guest.

Если вы предпочитаете инструмент командной строки, rabbitmqctl используйте в качестве альтернативы.

PIP представляет собой менеджер пакетов для Python, похожие на PHP PEAR о PECL, или CPAN Perl. Он может быть использован, для легкой установки Pika, библиотеки RabbitMQ для Python.

sudo pip install pika

На главной странице RabbitMQ предоставлены ссылки на разные библиотеки AMQP для PHP, но только одну я нашел, для работа без головной боли это PHP-amqplib, доступно из GitHub. Если вы еще не установили Git, установите его в качестве проекта, он делает файлы зависящие от клонирования и некоторые дополнительные подмодули.

Полный README можно найти на GitHub странице проекта, короткая версия выглядит следующим образом:

git clone git://github.com/videlalvaro/php-amqplib.git
cd php-amqplib/make

config.php файл будет содержать основные настройки соединения. Это место, вносить любые изменения, если вы установили сервер RabbitMQ локально и больше нигде.

к меню ↑

Queues и Exchanges

Беглый взгляд на первые несколько строк amqp_publisher.php раскрывает некоторые основные идеи RabbitMQ.

Queues (Очередь) в RabbitMQ можно рассматривать как ящик, или входящие, или конечная точка, куда прибывают сообщения. Queues как правило используются потребителями как новые сообщение, но как потребители, так и производители могут создать Queues (очереди), которые они будут использовать.

$ch->queue_declare($queue, false, true, false, false);

Дополнительные логические параметры соответствуют пассивным, passive, durable, и auto_delete они полностью документированы онлайн.

queue_declare() создает очередь с именем msgs. Если очередь с именем msgs уже существует, ничего лишнего не произойдет. Только одна очередь с уникальным именем может быть создана сразу. В связи с этим характерно что как потребитель и производитель программы, будут делать вызов queue_declare(). Это гарантирует, что очередь всегда будет готова, если вы не уверены, какая программа (отправитель или получатель) будет работать в первую очередь. Важно также отметить, что сообщения не записываются в очередь напрямую — они должны пройти через Exchanges (обмен).

Exchanges все вещи в пакете, когда вы думаете о службе доставке или о почтовом отделение аналогии RabbitMQ. Мы не посылаем пакет непосредственно в почтовый ящик друга, а мы переводим его в пункт сбора, и только потом направляется к месту назначения. В этом демо, исходным кодом, переменную $exchange лучше было бы назвать «маршрутизатор», который является еще одним хорошим способом обмена.

$ch->exchange_declare($exchange, 'direct', false, true, false);

Опять же есть несколько дополнительных параметров: passive, durable, и auto_delete. См. документацию для получения дополнительной информации.

Второй параметр direct является типом обмена. Чтобы понять, какие бывают типы обменов, нам необходимо знать, ключи привязки и ключи маршрутизации. Ключ-идентификатор маршрутизации, который используется когда производитель публикует сообщение для обмена. Обязательный ключ-идентификатор, который связывает определенную очередь на обмен. И ключи должны превышать 255 байт.
В обмене непосредственно маршрутизатор отсылает ключ сообщения в пункт сбора. Если очередь связывается с отправкой с привязанным ключом, который непосредственно соответствует ключу маршрутизатора, сообщение передаётся в очередь.

На диаграмме ниже, очередь Q1 связана с обменом binding_key="spades", и очереди Q2 связан с тем же обменом binding_key="clubs"

Установка RabbitMQ
Аналогии RabbitMQ

Если мы посылаем сообщение вида (message="Ace", routing_key="spades"), то это сообщение будет в конечном итоге в Q1. Отправка сообщения в форме (message="King", routing_key="clubs") приведет к Q2. Вполне возможно, для Q1 и Q2 иметь несколько привязок к тому же обмену. Q1 могут быть связаны с spades и hearts, так что любое сообщение с ключом маршрутизации spades или hearts, будут направляться на Q1.
Другой тип обмена известен как разветвления. В этом типе обмена, ключ маршрутизации не важен, потому что обмен будет транслировать сообщение для всех известных ограниченных очередей. Это, наверное, простейшая работа обмена.
Более интересный тип обмена называется topic (тематика). Тематика обмена использует разделенные точки групп слов для маршрутизации ключей, которые обеспечивают более сложную маршрутизацию. Например, error.production.database или weather.ny.syracuse.
При привязке очереди на тематику обмена, мы можем использовать два специальных символа, чтобы соответствовать ключам маршрутизации в ограниченных модах регулярных выражений.

  • * (Звездочка) — соответствует ровно одно слово
  • # (Решетка) — соответствует одному или более слов

Если Q1 связан с обязательным ключом *.production.*, Q1 получает любое сообщение любой степени тяжести. Все следующие ключи маршрутизации будут направляться на Q1:

  • error.production.database
  • info.production.database
  • debug.production.web

Q2 связан с info.# Не получает информации сообщения, независимо от источника. Все эти ключи маршрутизации попадают в Q2:

  • info.staging.database
  • info.production.web

Q3 может получить все базы данных сообщений с обязательным *. *. Базы данных.

к меню ↑

Производитель и потребитель

Давайте создадим пару простых демонстрационных программ, по одной в PHP который будет производить сообщения и один в Python, который будет в качестве потребителя. Все сообщения будут передаваться через тематику обмена.

<?php
include("config.php");
use PhpAmqpLib\Connection\AMQPConnection;
use PhpAmqpLib\Message\AMQPMessage;

$exchange = "rabbitmq_demo";
$exchangeType = "topic";
$queue = "events";

$message = $_SERVER["argv"][1];
$routingKey = $_SERVER["argv"][2];

$connection = new AMQPConnection(HOST, PORT, USER, PASS, VHOST);
$channel = $connection->channel();

// declare/create the queue
$channel->queue_declare($queue, false, true, false, false);

// declare/create the exchange as a topic exchange.
$channel->exchange_declare($exchange, $exchangeType, false, false, false);

$msg = new AMQPMessage($message, array("content_type" => "text/plain"));

$channel->basic_publish($msg, $exchange, $routingKey);
print "Sent $message ($routingKey)\n";
$channel->close();
$connection->close();
?>
import sys
import pika

EXCHANGE = "rabbitmq_demo"
EXCHANGE_TYPE = "topic"
QUEUE = "events"

# consume callback function
def callback(ch, method, properties, body):
print " - Received '%s' on routing_key %s" % (body, method.routing_key)
# Anything else could happen here:
# Send an email alert, send an xmnp message, trigger another process, etc

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange=EXCHANGE, type=EXCHANGE_TYPE)
result = channel.queue_declare(queue=QUEUE, durable=True)

if len(sys.argv) != 2:
sys.exit("You must provide a binding key.")
else:
key = sys.argv[1]
channel.queue_bind(exchange=EXCHANGE, queue=QUEUE, routing_key=key)

print " Listening for messages..."
channel.basic_consume(callback, queue=QUEUE, no_ack=True)
channel.start_consuming()

Программа производитель PHP займет два аргумента командной строки: само сообщение и ключ маршрутизации. Программа потребительского Python будет обязательным ключом в качестве единственного аргумента. Они будут создавать тематику обмена с называнием rabbitmq_demo а очереди с называнием events (события).

Запустите программу Python следующим образом:

python topic_consumer.py python topic_consumer.py errors.production.*

Это будет слушать по производству ошибок с любого источника (базы данных, веб-сервер и т.д.).

Теперь запустите программу PHP с сообщением об ошибке и ключ маршрутизации:

php topicProducer.php «the prod database has been deleted.
call the authorities» errors.production.database

Вы должны увидеть сообщение полученное потребителем Python.

Listening for messages… — Received
‘the prod database has been deleted. call the authorities’
on routing_key errors.production.database

Это сообщение, отправленное от производителя, должно быть проигнорировано потребителем с момента когда ключи маршрутизации не совпадут:

php topicProducer.php «DNS server timeout» warnings.prod.dns

Вы можете нажать Control + C в любое время остановить потребителя Python, а затем начать подымать его обратно с различными обязательными ключами, чтобы поиграть с сообщениями маршрутизации.

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

к меню ↑

Заключение

Если ваша потребительская программа смогла подключиться к библиотеке электронной почты или XMNP, чтобы предупредить человека о проблеме уровня производства, RabbitMQ может сделать это намного проще.
Если у вас есть сайт написан на PHP, который ответственен за загрузку и обработку большого количества пользователей фотографии и видео. Вы можете переложить бремя быстрой обработки или специализированного языка, который может работать в фоновом режиме или на другом экземпляре сервера. RabbitMQ может быть сконфигурирован как обработчик очереди для такой ситуации.

htmlhook.ru | Скрипты для веб-приложений