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.