Message Queue mit Redis konfigurieren

Sofern mehrere Prozesse zur Abarbeitung von Nachrichten aus der Message Queue von Shopware 6 eingesetzt werden sollen, muss sichergestellt werden, dass identische Nachrichten nicht von den selben Consumern abgearbeitet werden. Hierzu ist die Verwendung einer Technologie notwendig, die das atomare Sperren von Nachrichten unterstützt. Hierfür eignen sich Redis oder RabbitMQ.


Vorbereitung in Shopware

Zunächst muss der Admin Worker deaktiviert werden, damit die Message Queue über einen Hintergrund-Prozess abgearbeitet werden kann. Mehr Informationen zum Deaktivieren des Admin Workers und der initialen Einrichtung über einen Systemd-Service erfahren Sie hier: Shopware 6 Background Queue Worker einrichten.



Konfiguration der Shopware Umgebungskonfiguration

Erstellen Sie eine neue Konfigurationsdatei unter dem Pfad: config/packages/messenger.yaml. Mithilfe dieser Konfigurationsdatei kann der Shopware Messenger Transport-Dienst konfiguriert werden. Fügen Sie anschließend folgenden Inhalt in die Datei ein:

parameters:
  env(MESSENGER_CONSUMER_NAME): 'consumer'

framework:
  messenger:
    transports:
      default:
        dsn: "redis://%env(REDIS_HOST)%:%env(REDIS_PORT)%/messages/symfony/consumer-%env(MESSENGER_CONSUMER_NAME)%/?delete_after_ack=true&delete_after_reject=true&dbindex=%env(REDIS_DB_MESSENGER)%"


In dieser Konfigurationsdatei werden folgende Umgebungsvariablen genutzt:

Variable Beschreibung
MESSENGER_CONSUMER_NAME Name des Consumers (Der Name muss pro Consumer eindeutig sein) Definition in den Systemd-Services
REDIS_HOST Hostname oder IP-Adresse zum Redis-Server Definition in der .env.local
REDIS_PORT TCP-Port für Redis Verbindungen (Standard: 6379) Definition in der .env.local
REDIS_DB_MESSENGER Redis-Datenbank für den Messenger Definition in der .env.local


Die hier verwendeten Variablen müssen anschließend in der Umgebungskonfiguration .env.local von Shopware hinzugefügt werden. Öffnen Sie hierzu die .env.local Datei im Shopware Root-Verzeichnis und ergänzen Sie folgenden Teil in der bestehenden Konfiguration:

# .env.local

# [...]

REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_DB_MESSENGER=1


Die Umgebungsvariable MESSENGER_CONSUMER_NAME muss durch den Systemd- oder Supervisor-Service überschrieben werden, sodass auch die Ausführung von mehreren gleichzeitigen Consumern unterstützt werden kann.


Speichern Sie die Datei anschließend und leeren Sie den Shopware Cache über die Konsole:

bin/console cache:clear


Anschließend wird die Shopware Message Queue über Redis ausgeführt.



Konfiguration der Systemd-Services

Im nächsten Schritt müssen die Systemd-Services für die Ausführung der Message Queue Consumer vorbereitet werden. Hierzu muss pro Consumer eine Environment Direktive ergänzt werden.


Beispiel für den Systemd-Service:

# consumer1

[Service]
# Unique Messenger Consumer Name
Environment=MESSENGER_CONSUMER_NAME=consumer1

# [..]
# consumer2

[Service]
# Unique Messenger Consumer Name
Environment=MESSENGER_CONSUMER_NAME=consumer2

# [..]


Führen Sie anschließend den Befehl systemctl daemon-reload aus, damit die Änderungen wirksam werden. Starten Sie anschließend die zugehörigen Systemd-Services mit dem Befehl systemctl restart shopware_consumer_* neu.


Prüfen Sie zuletzt, ob die messenger:consume Prozesse einwandfrei arbeiten.

systemctl status shopware_consumer_*


Beispiel-Ausgabe:

● shopware_consumer.service - Shopware Message Queue Consumer #1
     Loaded: loaded (/etc/systemd/system/shopware_consumer.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-12-01 14:00:00 CET; 60s ago
   Main PID: 501963 (php)
      Tasks: 1 (limit: 19169)
     Memory: 111.8M
        CPU: 11.298s
     CGroup: /system.slice/shopware_consumer.service
             └─501963 php /var/www/domain.com/shopware/current/bin/console messenger:consume --time-limit=120 --memory-limit=512M

Dez 01 14:01:00 demo.creolineserver.com systemd[1]: Started Shopware Message Queue Consumer #1.
Dez 01 14:01:00 demo.creolineserver.com php[501963]:  [OK] Consuming messages from transports "default".
Dez 01 14:01:00 demo.creolineserver.com php[501963]:  // The worker will automatically exit once it has exceeded 512M of memory, been
Dez 01 14:01:00 demo.creolineserver.com php[501963]:  // running for 121s or received a stop signal via the messenger:stop-workers
Dez 01 14:01:00 demo.creolineserver.com php[501963]:  // command.
Dez 01 14:01:00 demo.creolineserver.com php[501963]:  // Quit the worker with CONTROL-C.
Dez 01 14:01:00 demo.creolineserver.com php[501963]:  // Re-run the command with a -vv option to see logs about consumed messages.