Denis Brumann SensioLabs

„Symfonys Messenger-Komponente macht die Einführung asynchroner Verarbeitung in eine bestehende Anwendung einfacher denn je.“

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.

Die Messenger-Komponente implementiert das Message-Bus-Entwurfsmuster. 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 Message Bus 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 Bus 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 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 HandlerInterface implementiert werden damit Symfonys Dependency-Injection-Komponente per Auto-Konfiguration den Tag automatisch hinzufügen kann.

Den vollständigen Artikel lesen Sie in der Ausgabe:

PHP Magazin 1.19 - "Symfony: Die neue Messenger-Komponente"

Alle Infos zum Heft
579859341Symfonys neue Messenger-Komponente
X
- Gib Deinen Standort ein -
- or -