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
Sentry Performance, PHP a GraphQL
Jak využít Sentry Performance pro monitoring výkonu PHP aplikace včetně výkonu GraphQL API.
Číst vícePotřebujete více informací?
Zpráva byla úspěšně odeslána.
Děkujeme
Omlouváme se, ale zprávu se nepovedlo odeslat.
Budeme rádi, když nám o tomto dáte vědět na info@id-sign.com