Middle
Co je RabbitMQ?
sobes.tech AI
Odpověď od AI
RabbitMQ je broker zpráv, který implementuje protokol AMQP (Advanced Message Queuing Protocol). Umožňuje aplikacím asynchronně komunikovat odesíláním a přijímáním zpráv prostřednictvím centralizovaného systému. RabbitMQ zajišťuje spolehlivé doručení, směrování a ukládání zpráv.
Hlavní komponenty:
- Producent (Producer): Odesílá zprávy do RabbitMQ.
- Exchange (Exchange): Přijímá zprávy od producentů a směruje je do jedné nebo více front na základě pravidel směrování.
- Fronta (Queue): Ukládá zprávy, dokud je nepřevezmou spotřebitelé.
- Spotřebitel (Consumer): Přijímá zprávy z front ke zpracování.
Typy exchange:
- Direct: Směruje zprávy do front, kde klíč směrování přesně odpovídá klíči vazby fronty.
- Fanout: Směruje zprávy do všech připojených front, ignorujíc klíč směrování.
- Topic: Směruje zprávy na základě částečné shody klíče směrování s vzorem klíče vazby (použitím znaků
*a#). - Headers: Směruje zprávy na základě hlaviček zprávy, nikoli klíče směrování.
Použití v PHP:
- Odložené zpracování úloh: např. odesílání emailů, generování reportů, zpracování obrázků.
- Architektura mikroslužeb: Asynchronní komunikace mezi službami.
- Systémy v reálném čase: Zpracování velkého toku událostí.
- Vyvažování zátěže: Rozdělení úloh mezi více pracovníků.
Příklad odeslání zprávy pomocí knihovny 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] Odesláno '" . $data . "'\n";
$channel->close();
$connection->close();
Příklad příjmu zprávy:
<?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 " [*] Čekání na zprávy. Pro ukončení stiskněte CTRL+C\n";
$callback = function ($msg) {
echo " [x] Přijato '" . $msg->body . "'\n";
};
$channel->basic_consume('my_queue', '', false, true, false, false, $callback);
while ($channel->is_consuming()) {
$channel->wait();
}
$channel->close();
$connection->close();
RabbitMQ zajišťuje odolnost proti chybám, škálovatelnost a flexibilitu při navrhování distribuovaných systémů.