Genau hier kommt RabbitMQ für Shopware ins Spiel – eine Lösung, die nicht nur diese akuten Probleme behebt, sondern deinen Shop auf ein völlig neues Performance-Level hebt.
RabbitMQ ist ein sogenannter Message Broker – ein intelligenter Vermittler, der die Kommunikation zwischen verschiedenen Teilen deiner Shopware-Installation orchestriert. Stell dir vor, du hättest einen extrem effizienten Assistenten, der alle zeitaufwendigen Aufgaben sammelt und sie systematisch abarbeitet, während dein Shop unterbrechungsfrei weiterläuft.
Bei einer Standard-Shopware-Installation werden viele Prozesse direkt ausgeführt: E-Mail-Versand, Bildoptimierung, Indexierung der Produktdaten oder die Synchronisation mit externen Systemen. Das bedeutet, dass Kunden warten müssen, bis diese Prozesse abgeschlossen sind. Mit RabbitMQ wandeln sich diese blockierenden Vorgänge in asynchrone Verarbeitung in Hintergrundprozesse um.
RabbitMQ arbeitet mit drei zentralen Elementen, die perfekt mit Shopware harmonieren:
Producer (Erzeuger): Das ist dein Shopware-System, das Nachrichten erstellt. Wenn ein Kunde eine Bestellung aufgibt, erstellt Shopware eine Nachricht "Bestellbestätigung versenden".
Queue (Warteschlange): Hier werden alle Nachrichten gesammelt und geordnet gespeichert, bis sie bearbeitet werden können. Verschiedene Arten von Aufgaben landen in unterschiedlichen Warteschlangen.
Consumer (Verbraucher): Diese Worker-Prozesse holen sich die Nachrichten aus den Warteschlangen und führen die eigentlichen Aktionen aus – unabhängig vom Hauptsystem.
Bevor du RabbitMQ mit deinem Shopware-Shop verbindest, musst du zunächst den Message Broker auf deinem Server installieren. Die meisten Hosting-Provider bieten mittlerweile RabbitMQ als Service an – eine deutliche Erleichterung gegenüber der manuellen Installation.
Für die Konfiguration in Shopware öffnest du die Datei config/packages/enqueue.yaml und fügst deine RabbitMQ-Konfiguration hinzu:
enqueue:
default:
transport: "amqp://username:password@rabbitmq-server:5672/vhost"
client: ~
Im nächsten Schritt verbindest du Shopware mit deiner RabbitMQ-Instanz über die config/packages/framework.yaml:
framework:
messenger:
default_bus: messenger.bus.shopware
transports:
async: 'enqueue://default'
routing:
'Shopware\Core\Content\Mail\Message\SendMailMessage': async
'Shopware\Elasticsearch\Framework\Indexing\*': async
Diese Konfiguration sorgt dafür, dass E-Mail-Nachrichten und Elasticsearch-Indexierung automatisch in die asynchrone Verarbeitung wandern.
Der E-Mail-Versand ist einer der häufigsten Performance-Killer in Shopware-Shops. Ohne RabbitMQ wartet jeder Kunde nach seiner Bestellung, bis die Bestellbestätigung tatsächlich versendet wurde. Bei Problemen mit dem Mail-Server kann das mehrere Sekunden dauern.
Mit RabbitMQ wird die E-Mail-Nachricht sofort in eine Warteschlange eingereiht, der Kunde sieht seine Bestätigungsseite und im Hintergrund kümmert sich ein Worker um den Versand. Selbst wenn der Mail-Server temporär nicht erreichbar ist, gehen keine E-Mails verloren – sie werden einfach später versendet.
Shopware nutzt Elasticsearch für die Produktsuche und erstellt Indizes, wenn du Produktdaten änderst. Dieser Vorgang kann bei großen Katalogen erhebliche Zeit in Anspruch nehmen. RabbitMQ-basierte Indexierung ermöglicht es, diese Prozesse vollständig vom Frontend zu entkoppeln.
Wenn Kunden oder Administratoren neue Produktbilder hochladen, müssen diese in verschiedenen Größen generiert und optimiert werden. Dieser ressourcenintensive Prozess läuft mit RabbitMQ im Hintergrund ab, ohne die User Experience zu beeinträchtigen.
Für optimale Performance solltest du mehrere Consumer-Prozesse parallel laufen lassen:
php bin/console messenger:consume async --limit=100 --memory-limit=256M
php bin/console messenger:consume async --limit=100 --memory-limit=256M
php bin/console messenger:consume async --limit=100 --memory-limit=256M
Jeder Worker übernimmt Nachrichten aus der Warteschlange und arbeitet sie unabhängig ab. Die Limits sorgen dafür, dass die Prozesse regelmäßig neu starten und Speicherlecks vermieden werden.
Eine professionelle RabbitMQ-Konfiguration nutzt verschiedene Queues für unterschiedliche Aufgabentypen:
| Queue-Name | Verwendung | Priorität |
|---|---|---|
high_priority |
Bestellbestätigungen, kritische E-Mails | Hoch |
default |
Standard-Nachrichten, Newsletter | Normal |
low_priority |
Indexierung, Berichte | Niedrig |
images |
Bildoptimierung, Thumbnails | Normal |
RabbitMQ bietet ein webbasiertes Management-Interface, über das du den Status deiner Warteschlangen überwachen kannst:
Für Produktionsumgebungen solltest du einen Prozess-Manager wie Supervisor verwenden, der deine RabbitMQ-Worker automatisch startet und überwacht:
[program:shopware-worker]
command=php /var/www/shopware/bin/console messenger:consume async --limit=100
directory=/var/www/shopware
autostart=true
autorestart=true
user=www-data
numprocs=3
Wenn Nachrichten nicht verarbeitet werden, überprüfe:
# config/packages/enqueue.yaml
enqueue:
default:
transport:
dsn: "amqp://user:pass@localhost:5672/shopware"
options:
persistent: true
lazy: false
connection_timeout: 10
client:
prefix: shopware
app_name: shopware
Für große Shopware-Installationen mit mehreren App-Servern ist RabbitMQ besonders wertvoll. In Cluster-Setups können alle Server Nachrichten in dieselben Warteschlangen einreihen, während dedizierte Worker-Server die Verarbeitung übernehmen.
enqueue:
default:
transport: "amqp://user:pass@rabbitmq-cluster:5672/shopware?heartbeat=30"
client:
router_topic: 'router'
router_queue: 'default'
default_queue: 'default'
Für kritische Systeme empfiehlt sich ein RabbitMQ-Cluster mit mehreren Nodes:
Die Einführung von RabbitMQ in einem mittelgroßen Shopware-Shop (50.000 Produkte, 1.000 Bestellungen/Tag) zeigt typischerweise folgende Verbesserungen:
| Metrik | Ohne RabbitMQ | Mit RabbitMQ | Verbesserung |
|---|---|---|---|
| Bestellabschluss-Zeit | 3,5 Sekunden | 0,8 Sekunden | 77% schneller |
| E-Mail-Versand-Verzögerung | 2-15 Sekunden | Sofort | 100% |
| Produktaktualisierung | 5-30 Sekunden | 1 Sekunde | 95% schneller |
| Server-CPU-Last | 85% Spitzen | 45% konstant | 47% Reduktion |
RabbitMQ und Elasticsearch ergänzen sich perfekt. Während Elasticsearch für blitzschnelle Suchergebnisse sorgt, übernimmt RabbitMQ die zeitaufwendige Indexierung im Hintergrund:
routing:
'Shopware\Elasticsearch\Framework\Indexing\ElasticsearchIndexingMessage': elasticsearch_queue
'Shopware\Elasticsearch\Product\ProductUpdater': elasticsearch_queue
Wenn du eigene Shopware-Plugins entwickelst, kannst du RabbitMQ für ressourcenintensive Aufgaben nutzen:
// Message-Klasse erstellen
class CustomDataProcessingMessage
{
private $productId;
private $options;
public function __construct(string $productId, array $options)
{
$this->productId = $productId;
$this->options = $options;
}
// Getter methods...
}
// Handler implementieren
class CustomDataProcessingHandler extends AbstractMessageHandler
{
public function handle($message): void
{
// Zeitaufwendige Verarbeitung hier
$this->processProductData($message->getProductId(), $message->getOptions());
}
public static function getHandledMessages(): iterable
{
return [CustomDataProcessingMessage::class];
}
}
Für Produktionsumgebungen solltest du immer sichere RabbitMQ-Verbindungen verwenden:
enqueue:
default:
transport: "amqps://username:password@secure-rabbitmq.example.com:5671/shopware"
RabbitMQ-Nachrichten sind persistent gespeichert, aber für kritische Systeme solltest du regelmäßige Backups der Queue-Definitionen und -Inhalte erstellen:
# Queue-Definitionen exportieren
rabbitmqctl export_definitions /backup/queues-backup.json
# Monitoring der Queue-Größen
rabbitmqctl list_queues name messages
Die Einführung von RabbitMQ verursacht zunächst zusätzliche Infrastrukturkosten:
Diese Investition amortisiert sich jedoch schnell durch:
Der Umstieg von Shopwares Standard-Message-Queue auf RabbitMQ sollte schrittweise erfolgen:
# Aktuelle Queue-Größe prüfen
php bin/console messenger:stats
# RabbitMQ-Transport hinzufügen
# Zunächst nur für neue Nachrichten-Typen
# Beginne mit unkritischen Prozessen
routing:
'App\Newsletter\SendNewsletterMessage': rabbitmq_transport
routing:
'*': rabbitmq_transport # Alle Nachrichten über RabbitMQ
RabbitMQ ist nicht nur eine aktuelle Lösung, sondern eine zukunftssichere Investition. Mit der weiteren Entwicklung von Shopware werden Message-Queues noch wichtiger:
Die Implementierung von RabbitMQ in deinem Shopware-Shop ist mehr als nur ein technisches Upgrade – es ist ein fundamentaler Schritt hin zu einer professionellen, skalierbaren E-Commerce-Architektur. Die asynchrone Verarbeitung von Nachrichten löst nicht nur aktuelle Performance-Probleme, sondern schafft die Grundlage für zukünftiges Wachstum.
Der Schlüssel zum Erfolg liegt in der systematischen Herangehensweise: Beginne mit der sorgfältigen Planung deiner Queue-Struktur, implementiere Schritt für Schritt die wichtigsten Prozesse und überwache kontinuierlich die Performance. RabbitMQ wird zu einem unsichtbaren, aber unverzichtbaren Fundament deines Shops – deine Kunden werden die verbesserte Performance sofort spüren, ohne je zu wissen, welche Technologie dahintersteckt.
Mit der richtigen RabbitMQ-Konfiguration verwandelst du deinen Shopware-Shop von einem reaktiven System in eine proaktive, hochperformante E-Commerce-Plattform, die auch bei steigenden Anforderungen zuverlässig funktioniert.