Sobes.tech
Middle

Čo je RabbitMQ?

sobes.tech AI

Odpoveď od AI

RabbitMQ je broker správ, ktorý implementuje protokol AMQP (Advanced Message Queuing Protocol). Umožňuje aplikáciám asynchrónne komunikovať odosielaním a prijímaním správ prostredníctvom centralizovaného systému. RabbitMQ zabezpečuje spoľahlivé doručenie, smerovanie a ukladanie správ.

Hlavné komponenty:

  • Producent (Producer): Odosiela správy do RabbitMQ.
  • Exchange (Exchange): Prijíma správy od producentov a ich smeruje do jednej alebo viacerých front na základe pravidiel smerovania.
  • Fronta (Queue): Ukladá správy, kým ich neprevezmú spotrebitelia.
  • Spotrebiteľ (Consumer): Prijíma správy z front na spracovanie.

Typy exchange:

  • Direct: Smeruje správy do front, kde kľúč smerovania presne zodpovedá kľúču väzby frontu.
  • Fanout: Smeruje správy do všetkých pripojených front, ignorujúc kľúč smerovania.
  • Topic: Smeruje správy na základe čiastočnej zhody kľúča smerovania s vzorom kľúča väzby (použitím znakov * a #).
  • Headers: Smeruje správy na základe hlavičiek správy, nie kľúča smerovania.

Použitie v PHP:

  • Odložené spracovanie úloh: napr. odosielanie emailov, generovanie správ, spracovanie obrázkov.
  • Mikroslužbová architektúra: Asynchrónna komunikácia medzi službami.
  • Systémy v reálnom čase: Spracovanie veľkého toku udalostí.
  • Vyvažovanie záťaže: Rozdeľovanie úloh medzi viacerých pracovníkov.

Príklad odoslania správy pomocou knižnice 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] Odoslané '" . $data . "'\n";

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

Príklad prijatia sprá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 " [*] Čaká sa na správy. Pre ukončenie stlačte CTRL+C\n";

$callback = function ($msg) {
    echo " [x] Prijaté '" . $msg->body . "'\n";
};

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

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

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

RabbitMQ zabezpečuje odolnosť voči chybám, škálovateľnosť a flexibilitu pri navrhovaní distribuovaných systémov.