Queues in Pimcore lassen sich mit Symfony Messenger so einfach umsetzen wie nie zuvor. Sie möchten Antwortzeiten verkürzen und zeitaufwendige Aufgaben an passende Services abgeben? So funktioniert es.
Auf dieser Seite 6 Abschnitte
Weniger warten: Symfony Messenger erledigt Aufgaben Ihrer Pimcore-Anwendung im Hintergrund.
Was ist Symfony Messenger?
Mit Symfony Messenger verwalten Anwendungen Queues besser, vor allem bei der Kommunikation mit anderen Systemen oder wenn Aufgaben an andere Services übergeben werden. Pimcore hat alle früheren asynchronen Queues durch Symfony Messenger ersetzt. Deshalb lässt er sich deutlich einfacher in Ihr Projekt integrieren.
Ein Beispiel aus der Praxis
Angenommen, Ihre Website hat ein Formular für die Teilnahme an einem Gewinnspiel, ein ganz einfaches mit nur drei Feldern:
- firstname
- message

Es entspricht außerdem weitgehend der Klassendefinition der Objekte, die in Pimcore gespeichert werden.

Der Controller verarbeitet das Formular, speichert das Objekt in der Datenbank und versendet eine passende E-Mail.
Das funktioniert gut. Aber geht es besser?
Wo liegt das Problem?
Vor der Einführung von Symfony Messenger dauerte es rund 4 Sekunden, das Formular zu verarbeiten, das Objekt zu speichern und die E-Mail zu senden.

Warum? Hauptursache ist die Kommunikation mit dem SMTP-Server, der die E-Mails versendet. Lässt man diesen Schritt weg und speichert nur das Objekt, ist die Verarbeitungszeit eine völlig andere. Dieser Unterschied beeinflusst, wie Nutzer die Bedienbarkeit und Performance der Website wahrnehmen.

Die Magie der Queues
Genau deshalb hat Pimcore die alten asynchronen Queues durch Symfony Messenger ersetzt. Sie benötigen zwei Klassen:
- CompetitionApplicationMessage speichert die Daten, in diesem Fall die CompetitionApplication.
- CompetitionApplicationMessageHandler speichert in diesem Fall das Objekt und versendet die E-Mail.
Statt im Controller das Objekt zu speichern und die E-Mail zu senden, rufen Sie nun CompetitionApplicationMessage auf. Dazu injizieren Sie das MessageBusInterface in die Funktion, die Anfragen entgegennimmt. Denken Sie daran, Ihre Services umzustellen. Teilen Sie Ihrem Handler per YAML-Konfiguration mit, dass er jetzt ein Message Handler ist.
Klingt gut. Doch das Formular braucht weiterhin fast 4 Sekunden. Eine große Enttäuschung.
Der Schlüssel ist Asynchronität.
Symfony Messenger führt Aufgaben automatisch aus. Damit sie asynchron laufen, legen Sie in der Konfigurationsdatei config/packages/messenger.yaml fest, wie die Nachricht ausgeführt und verarbeitet werden soll. Die Umgebungsvariable MESSENGER_TRANSPORT_DSN bestimmt, welcher Transport für die Queues zuständig ist. Das kann Redis, RabbitMQ oder sogar eine Datenbank sein. Damit Queue-Aufgaben zuverlässig und regelmäßig über cron oder supervisord laufen, muss der Befehl php bin/console messenger:consume async ausgeführt werden.
Ergebnisse
Wenn wir unser Formular mit Symfony Messenger asynchron verarbeiten, verbessert sich die Performance deutlich.

Nutzen Sie zusätzlich ein Prozessmanagement wie supervisord, trägt der Service, der die Prozesse steuert, die Last der Aufgabenlogik und nicht die Anwendung. Bei hohem Traffic und vielen Prozessen kann das die wahrgenommene Performance und Stabilität erheblich verbessern.
Ein weiterer Vorteil: Ist der SMTP-Dienst nicht erreichbar, gilt die Aufgabe nicht als erledigt und wird bis zu dreimal erneut gestartet. Läge die Logik weiterhin im Controller und würde die E-Mail nicht korrekt versendet, gäbe es keinen neuen Versuch. Wie viele Wiederholungen es gibt und in welchen Abständen, legen Sie in der Konfiguration von Messenger fest.




