Sobes.tech
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ů.