Mit Shopware 6 kommen nun auch viele Komponenten von Symfony 4.4 zum Einsatz, auf welche viele Entwickler gewartet haben. Eine davon ist die Messenger Komponente. Mit dieser lassen sich einfach Nachrichten/Aufgaben asynchron von Shopware selbst oder externen Systemen verarbeiten.
Messenger Komponente
The Messenger component helps applications send and receive messages to/from other applications or via message queues.“ (Quelle)
Sprich wir können nun einfacher Aufgaben von extern entgegen nehmen und diese entsprechend abarbeiten, oder interne Funktionalitäten so implementieren, dass wir kein Sorge mehr um Systemabstürze oder Timeouts haben müssen.
Wenn Ihr mehr über Transport, Bus, Middleware, Envelope und Stamp wissen wollt empfehle ich auch die Doku von Shopware.
Enqueue
Ihr könnte alle von Symfony unterstützten Transports nutzen oder auf den Standard (Enqueue im Shopware Fall) setzen.
Shopware nutzt seit der einer EA Version statt dem File Transport den dbal Transport:
* Changed default enqueue transport from enqueue/fs to enqueue/dbal
Dafür wird die ConnectionFactoryFactory genutzt in der wir die entsprechende Tabelle finden in der das ganze abgespeichert wird.
public function create($config): ConnectionFactory
{
$config = !is_array($config) ? [] : $config;
$config = array_replace_recursive([
'connection' => [],
'table_name' => 'enqueue',
'polling_interval' => 1000,
'lazy' => true,
], $config);
return new \Shopware\Core\Framework\MessageQueue\Enqueue\ConnectionFactory($this->connection, $config);
}
Diese hat folgende Struktur:
Wenn euch die Nutzung des Transport interessiert, schaut euch mal die Doku dazu an. Ich denke für den Standard Shop wird diese Integration ausreichen, sobald es aber um größere Setups geht könnten eventuell Table Locks ein Problem werden.
Beispiel – Thumbnails
In Shopware 6 werden zukünftig alle Thumbnails von Bildern über den Messagebus mit einer entsprechenden GenerateThumbnailsMessage() generiert.
Wir können uns dazu die Filesave Klasse anschauen -> /var/www/sw6/vendor/shopware/platform/src/Core/Content/Media/File/FileSaver.php in welcher wir in der persistFileToMedia() Methode die Zeilen:
$message = new GenerateThumbnailsMessage();
$message->setMediaIds([$mediaId]);
$message->withContext($context);
$this->messageBus->dispatch($message);
finden.
In dem obigen Message Ordner finden wir dann die entsprechenden Message Klassen und die Handler.
Message
Die Message ist eine einfache PHP Klasse, welche serialisierbar sein muss und alle nötigen Infos für den Handler enthalten sollte.
Handler
Der GenerateThumbnailsHandler verarbeitet die erstellte Message entsprechend und erbt vom AbstractMessageHandler.
Datenbank Beispiel
Wie das ganze dann in der Datenbank aussieht können wir mit dem php bin/console media:generate-thumbnails Befehl einmal anschauen:
body
O:36:\"Symfony\\Component\\Messenger\\Envelope\":2:{s:44:\"\0Symfony\\Component\\Messenger\\Envelope\0stamps\";a:1:{s:46:\"Symfony\\Component\\Messenger\\Stamp\\BusNameStamp\";a:1:{i:0;O:46:\"Symfony\\Component\\Messenger\\Stamp\\BusNameStamp\":1:{s:55:\"\0Symfony\\Component\\Messenger\\Stamp\\BusNameStamp\0busName\";s:22:\"messenger.bus.shopware\";}}}s:45:\"\0Symfony\\Component\\Messenger\\Envelope\0message\";O:81:\"Shopware\\Core\\Framework\\DataAbstractionLayer\\Indexing\\MessageQueue\\IndexerMessage\":3:{s:95:\"\0Shopware\\Core\\Framework\\DataAbstractionLayer\\Indexing\\MessageQueue\\IndexerMessage\0indexerNames\";a:1:{i:0;s:18:\"Swag.SeoUrlIndexer\";}s:92:\"\0Shopware\\Core\\Framework\\DataAbstractionLayer\\Indexing\\MessageQueue\\IndexerMessage\0timestamp\";O:8:\"DateTime\":3:{s:4:\"date\";s:26:\"2020-01-26 19:44:55.606245\";s:13:\"timezone_type\";i:3;s:8:\"timezone\";s:3:\"UTC\";}s:89:\"\0Shopware\\Core\\Framework\\DataAbstractionLayer\\Indexing\\MessageQueue\\IndexerMessage\0offset\";N;}}
Es wird auf jeden Fall interessant sein damit zu arbeiten, denn damit kann man hohe Lasten extrem gut abfangen und die entsprechenden aufwändigen Tasks in einer Queue abarbeiten.
Eventuelle Usecases
- E-Mail Versand
- Logging (Debug)
Pro & Contra
Vorteile
- asynchrone Verarbeitung
- gute Performance bei hoher Anzahl an Requests
- saubere Abarbeitung ohne Verluste
- Entkopplung
Nachteile
- höhere Komplexität
Beispiel Repository
Folgt in Kürze…