Nastavení více front RabbitMQ v Symfony pomocí enqueue-bundle

V tomto článku si ukážeme, jak ve Symfony projektu správně nastavit více front RabbitMQ pomocí knihovny enqueue-bundle a jak zajistit jejich efektivní zpracování pomocí specializovaných procesorů.

V případě, že ve svém Symfony projektu potřebujete zpracovávat zprávy pomocí různých front v systému RabbitMQ, nabízí knihovna enqueue/enqueue-bundle elegantní a flexibilní způsob, jak toho dosáhnout. Tento článek vás provede základním nastavením různých front a jejich zpracováním pomocí specifických procesorů.

1. Základní konfigurace knihovny enqueue

Ve vašem konfiguračním souboru (např. config/packages/enqueue.yaml) je potřeba definovat transport a klienta. Pro připojení k RabbitMQ použijeme DSN, který bude uložen v proměnném prostředí. Dále definujeme výchozí frontu a další parametry klienta:

enqueue:
    default:
        transport: '%env(resolve:ENQUEUE_DSN)%'
        client:
            app_name: "%enqueue_app_name%"
            default_queue: "%enqueue_default_queue%"
            redelivered_delay_time: 5
            router_topic: default
            router_queue: router
            router_processor: null
        job: true

Poznámka: Hodnoty enqueue_app_name a enqueue_default_queue si nastavte dle vlastních potřeb v .env nebo .env.local.

2. Definice procesorů a front

Pro správné směrování zpráv do různých front je nutné, aby každý procesor implementoval statickou metodu getSubscribedTopics, ve které definujete, jaká témata (topics) a fronty procesor obsluhuje. Zde je příklad:

use Enqueue\Client\TopicSubscriberInterface;

class TestProcessor implements TopicSubscriberInterface
{
    public function __invoke(Message $message, Context $context): string
    {
        // Zpracování zprávy
        return self::ACK;
    }

    public static function getSubscribedTopics(): array
    {
        return [
            [
                'topic' => 'test.misc',
                'queue' => 'test_queue',
                'prefix_queue' => true,
            ],
        ];
    }
}

Tímto způsobem můžete specifikovat, které zprávy mají být směrovány do jaké fronty a který procesor je bude obsluhovat.

3. Inicializace front a spuštění konzumentů

Po správné konfiguraci je potřeba připravit fronty v RabbitMQ a spustit konzumenty, kteří budou zprávy zpracovávat. Postupujte následovně:

a) Vytvoření všech potřebných front

bin/console enqueue:setup-broker

Tímto příkazem se vytvoří všechny fronty, včetně směrovací fronty (router), která je zodpovědná za distribuci zpráv do správných cílových front.

b) Spuštění router konzumenta

Router konzument naslouchá na router frontě a směruje zprávy dle pravidel definovaných v getSubscribedTopics() jednotlivých procesorů:

bin/console enqueue:consume router --time-limit="now + 300 seconds"

Tip: Tento proces doporučujeme spouštět samostatně jako daemon, např. pomocí Supervisoru nebo systemd.

c) Spuštění konzumentů pro jednotlivé fronty

Pro každou specifickou frontu spusťte konzumenta zvlášť. Příklad pro frontu test_queue:

bin/console enqueue:consume test_queue --time-limit="now + 300 seconds"

Tento konzument bude zpracovávat pouze zprávy směrované do fronty test_queue.

Shrnutí

Díky knihovně enqueue-bundle lze v Symfony jednoduše nastavit více front RabbitMQ, přiřadit jim specifické procesory a efektivně tak škálovat zpracování asynchronních úloh. Tento přístup se osvědčuje zejména u projektů s větším objemem zpráv nebo s různými typy zpracování.

Mohlo by vás také zajímat

EasyAdmin

Komfortní administrace pro snadnou správu vašich webových stránek

Číst více

Symfony

Špičkový PHP framework s vynikající dokumentací, širokou komunitou a jasným vývojovým plánem.

Číst více

Sentry Performance, PHP a GraphQL

Jak využít Sentry Performance pro monitoring výkonu PHP aplikace včetně výkonu GraphQL API.

Číst více

nám. Republiky 28
301 00 Plzeň
Česká republika
IČ: 28006402
DIČ: CZ28006402

© 2002 - 2025 iD-SIGN BRANDS MENTIONED ABOVE ARE PROPERTY OF THEIR RESPECTIVE OWNER.