© Arak Rattanawijittakorn/Shutterstock.com
PHP Magazin
Asynchrone Prozesse in Symfony realisieren

Die neue Messenger-Komponente

Eins der großen, neuen Features in Symfony 4 ist die im letzten Release veröffentlichte Messenger-Komponente. Vergleichbar mit dem EventDispatcher versendet sie Nachrichten, kann diese aber auch über Anwendungsgrenzen hinweg senden und empfangen. Damit bietet sie das Potenzial, Event Sourcing und CQRS in Symfony-Anwendungen einzuführen.

Denis Brumann


Die Messenger-Komponente implementiert das Message-Bus-Entwurfsmuster [1]. Im Kern geht es dabei um das Senden und Empfangen von Nachrichten. Auf diese Weise kann eine asynchrone Kommunikation zwischen Anwendungen ermöglicht werden. Eine Nachricht ist vergleichbar mit den bereits bekannten Events aus Symfony. Sie kapselt Daten, die von einer Absenderklasse an eine Empfängerklasse übermittelt werden. Welche Nachricht an welchen Empfänger übermittelt wird, wird vom Messagebus bestimmt. Das MessageBusInterface, über das man Nachrichten verschickt, hat nur eine Methode namens dispatch, der man ein beliebiges PHP-Objekt als Nachricht übergeben kann. Standardmäßig wird das Objekt mit der Serializer-Komponente in einen JSON-String umgewandelt und an einen Transport weitergereicht. Bei asynchroner Verarbeitung wird die Nachricht über einen Transport weitergeschickt. Ebenso holt der Messenger Nachrichten aus dem Transport, um sie zu verarbeiten. Aktuell unterstützt die Messenger-Komponente zwei native Transporte. Standardmäßig werden Nachrichten ohne Umwege, in der gleichen Anwendung, im selben PHP-Prozess synchron verarbeitet. Das ist vor allem für das Debugging hilfreich, da man zum Beispiel mit XDebug einfach nachverfolgen kann, wie die Nachricht verarbeitet wird. Der zweite Transport verwendet das AMQP-Protokoll über die entsprechende PHP-Extension zum Versand der Nachricht an eine Messagequeue und zum Empfangen von Nachrichten aus einer Messagequeue. Welcher Transport für welche Nachricht verwendet werden soll, wird über das Routing in der Konfiguration des Busses gesteuert. Um Nachrichten aus einer Messagequeue zu verarbeiten, kann ein CLI-Befehl ausgeführt werden. Neben den beiden unterstützten können über Adapter auch bereits vorhandene Transports zum Beispiel aus der beliebten Enqueue-Bibliothek [2] weiterverwendet werden. Das ist auch sinnvoll, wenn die AMQP-Extension nicht zur Verfügung steht und stattdessen eine PHP-Implementierung verwendet werden soll.

Für die Verarbeitung empfangener Nachrichten muss eine Klasse angelegt werden, die die magische Methode __invoke implementiert, deren einziges Argument das übermittelte PHP-Objekt, also die Klasse der ursprünglich versendeten Message ist. Diese Klasse muss dann im Messagebus als Handler registriert werden. Das passiert in einer Symfony-Anwendung über einen Service-Tag messenger.message_handler. Alternativ kann ein leeres Handler Interface implementiert werden, damit Symfonys Dependency-Injection-Kompo...

PHP Magazin
Asynchrone Prozesse in Symfony realisieren

Die neue Messenger-Komponente

Eins der großen, neuen Features in Symfony 4 ist die im letzten Release veröffentlichte Messenger-Komponente. Vergleichbar mit dem EventDispatcher versendet sie Nachrichten, kann diese aber auch über Anwendungsgrenzen hinweg senden und empfangen. Damit bietet sie das Potenzial, Event Sourcing und CQRS in Symfony-Anwendungen einzuführen.

Denis Brumann


Die Messenger-Komponente implementiert das Message-Bus-Entwurfsmuster [1]. Im Kern geht es dabei um das Senden und Empfangen von Nachrichten. Auf diese Weise kann eine asynchrone Kommunikation zwischen Anwendungen ermöglicht werden. Eine Nachricht ist vergleichbar mit den bereits bekannten Events aus Symfony. Sie kapselt Daten, die von einer Absenderklasse an eine Empfängerklasse übermittelt werden. Welche Nachricht an welchen Empfänger übermittelt wird, wird vom Messagebus bestimmt. Das MessageBusInterface, über das man Nachrichten verschickt, hat nur eine Methode namens dispatch, der man ein beliebiges PHP-Objekt als Nachricht übergeben kann. Standardmäßig wird das Objekt mit der Serializer-Komponente in einen JSON-String umgewandelt und an einen Transport weitergereicht. Bei asynchroner Verarbeitung wird die Nachricht über einen Transport weitergeschickt. Ebenso holt der Messenger Nachrichten aus dem Transport, um sie zu verarbeiten. Aktuell unterstützt die Messenger-Komponente zwei native Transporte. Standardmäßig werden Nachrichten ohne Umwege, in der gleichen Anwendung, im selben PHP-Prozess synchron verarbeitet. Das ist vor allem für das Debugging hilfreich, da man zum Beispiel mit XDebug einfach nachverfolgen kann, wie die Nachricht verarbeitet wird. Der zweite Transport verwendet das AMQP-Protokoll über die entsprechende PHP-Extension zum Versand der Nachricht an eine Messagequeue und zum Empfangen von Nachrichten aus einer Messagequeue. Welcher Transport für welche Nachricht verwendet werden soll, wird über das Routing in der Konfiguration des Busses gesteuert. Um Nachrichten aus einer Messagequeue zu verarbeiten, kann ein CLI-Befehl ausgeführt werden. Neben den beiden unterstützten können über Adapter auch bereits vorhandene Transports zum Beispiel aus der beliebten Enqueue-Bibliothek [2] weiterverwendet werden. Das ist auch sinnvoll, wenn die AMQP-Extension nicht zur Verfügung steht und stattdessen eine PHP-Implementierung verwendet werden soll.

Für die Verarbeitung empfangener Nachrichten muss eine Klasse angelegt werden, die die magische Methode __invoke implementiert, deren einziges Argument das übermittelte PHP-Objekt, also die Klasse der ursprünglich versendeten Message ist. Diese Klasse muss dann im Messagebus als Handler registriert werden. Das passiert in einer Symfony-Anwendung über einen Service-Tag messenger.message_handler. Alternativ kann ein leeres Handler Interface implementiert werden, damit Symfonys Dependency-Injection-Kompo...

Neugierig geworden?


   
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang