Sobes.tech
Middle

Kas yra RabbitMQ?

sobes.tech AI

Atsakymas iš AI

RabbitMQ yra žinučių tarpininkas, įgyvendinantis AMQP (Advanced Message Queuing Protocol) protokolą. Jis leidžia programoms asinchroniškai sąveikauti, siųsdamos ir gaudamos žinutes per centralizuotą sistemą. RabbitMQ užtikrina patikimą pristatymą, maršrutizavimą ir žinučių saugojimą.

Pagrindiniai komponentai:

  • Gamybininkas (Producer): Siunčia žinutes į RabbitMQ.
  • Mainų punktas (Exchange): Priima žinutes iš gamybinių šaltinių ir nukreipia jas į vieną ar daugiau eilių pagal maršrutizavimo taisykles.
  • Eilė (Queue): Laiko žinutes, kol jas paims vartotojai.
  • Vartotojas (Consumer): Priima žinutes iš eilių apdorojimui.

Mainų punktų tipai:

  • Direct: Nukreipia žinutes į eilutes, kuriose maršrutizacijos raktas tiksliai atitinka eilės ryšio raktą.
  • Fanout: Nukreipia žinutes į visas prijungtas eilutes, ignoruodamas maršrutizacijos raktą.
  • Topic: Nukreipia žinutes pagal dalinį maršrutizacijos rakto atitikimą su ryšio rakto šablonu (naudojant * ir # simbolius).
  • Headers: Nukreipia žinutes pagal žinučių antraštes, o ne maršrutizacijos raktą.

PHP taikymas:

  • Atidėto užduočių apdorojimo: pvz., el. pašto siuntimas, ataskaitų generavimas, vaizdų apdorojimas.
  • Mikropaslaugų architektūra: Asinchroninė sąveika tarp paslaugų.
  • Realaus laiko sistemos: Didelio įvykių srauto apdorojimas.
  • Naštos paskirstymas: Užduočių paskirstymas tarp kelių darbuotojų.

Žinučių siuntimo pavyzdys naudojant php-amqplib biblioteką:

<?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] Išsiųsta '" . $data . "'\n";

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

Žinučių gavimo pavyzdys:

<?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 " [*] Laukiama žinučių. Paspauskite CTRL+C norėdami išeiti\n";

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

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

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

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

RabbitMQ užtikrina atsparumą klaidoms, galimybę išplėsti ir lankstumą projektuojant paskirstytas sistemas.