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 осигурява устойчивост на откази, мащабируемост и гъвкавост при проектирането на разпределени системи.