Shopware 6 | Message Queue

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:

enqueue dbal Tabelle

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.

Message Ordner

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…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.