Sobes.tech
Middle

Какво е RabbitMQ?

sobes.tech AI

Отговор от AI

RabbitMQ е брокер на съобщения, който имплементира протокола AMQP (Advanced Message Queuing Protocol). Той позволява на приложенията да взаимодействат асинхронно, изпращайки и получавайки съобщения чрез централизирана система. RabbitMQ осигурява надеждна доставка, маршрутизиране и съхранение на съобщения.

Основни компоненти:

  • Производител (Producer): Изпраща съобщения към RabbitMQ.
  • Обменник (Exchange): Получава съобщения от производителите и ги насочва към една или повече опашки според правилата за маршрутизиране.
  • Опашка (Queue): Съхранява съобщенията, докато ги вземат потребителите.
  • Потребител (Consumer): Получава съобщения от опашките за обработка.

Типове обменници:

  • Direct: Насочва съобщения към опашки, където ключът за маршрутизиране точно съвпада с ключа за връзка на опашката.
  • Fanout: Насочва съобщения към всички свързани опашки, игнорирайки ключа за маршрутизиране.
  • Topic: Насочва съобщения въз основа на частично съвпадение на ключа за маршрутизиране с шаблон на ключа за връзка (използвайки символите * и #).
  • Headers: Насочва съобщения въз основа на заглавките на съобщението, а не на ключа за маршрутизиране.

Приложение в PHP:

  • Отложена обработка на задачи: например изпращане на имейл, генериране на отчети, обработка на изображения.
  • Микросервизни архитектури: Асиметрична комуникация между услуги.
  • Системи в реално време: Обработка на голям поток от събития.
  • Балансировка на натоварването: Разпределение на задачи между няколко работници.

Пример за изпращане на съобщение с помощта на библиотеката php-amqplib:

<?php
require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->exchange_declare('my_exchange', 'direct', false, false, false);
$channel->queue_declare('my_queue', false, false, false, false);
$channel->queue_bind('my_queue', 'my_exchange', 'my_routing_key');

$data = 'Hello, RabbitMQ!';
$msg = new AMQPMessage($data);

$channel->basic_publish($msg, 'my_exchange', 'my_routing_key');

echo " [x] Изпратено '" . $data . "'\n";

$channel->close();
$connection->close();

Пример за получаване на съобщение:

<?php
require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('my_queue', false, false, false, false);

echo " [*] Очакване на съобщения. За изход натиснете CTRL+C\n";

$callback = function ($msg) {
    echo " [x] Получено '" . $msg->body . "'\n";
};

$channel->basic_consume('my_queue', '', false, true, false, false, $callback);

while ($channel->is_consuming()) {
    $channel->wait();
}

$channel->close();
$connection->close();

RabbitMQ осигурява устойчивост на откази, мащабируемост и гъвкавост при проектирането на разпределени системи.