Shopware 6

Shopware 6 - Worker / Aufgabensteuerung

Shopware 6 basiert auf Symfony, dass sollte uns allen bereits bekannt sein.
In dem Artikel erkläre ich Dir grob, wie Shopware 6 mit Aufgaben arbeitet.

Erklärung der Aufgabensteuerung

Gänzlich anders zu Shopware 5 findet in Shopware 6 eine Aufgabensteuerung statt.
Als Beispiel nehme ich hier den Cache Warmer.

In Shopware 5 wurde bin/console sw:cache:warm ausgeführt und der Prozess selber führte dann das Aufwärmen durch.

In Shopware 6 hingegen erstellelt der Befehl bin/console http:cache:warm:up Aufgabenblöcke, damit der Worker den Cache aufwärmt. In diesem Blackfire Trace können wir sehen, was passiert:

  ▹ https://blackfire.io/profiles/6fea6b58-3d50-4e05-a4ef-cca77ed7c7bf/graph

Es werden so genannte "Messages" (umschrieben Aufgaben) erstellt. Diese werden in der enqueue Tabelle gespeichert.
In unserem Fall sieht es so aus:

  ▹ sw6_enqueue_example.txt

Abarbeiten der Messages

Alle Einträge in dieser Tabelle werden durch Worker abgearbeitet, diese werden standardmäßig durch das Backend erstellt. ¹

Vermutlich war das für Shopware der einfachste Umsetzungsweg, in der Praxis jedoch tauchen dadurch teilweise massive Performance Probleme auf.

Shopware achtet in keinsterweise darauf, dass nicht zu viele Worker aktiv sind.
Wenn nun also viele Messages vorhanden sind, dann werden diese gänzlich ohne Rücksicht auf Verluste durchgeballert.
Das hat logischerweise zur Folge:

• Überlastung des Servers
• Shop Funktionalität ist eingeschränkt/nicht Erreichbar

Es ist also gelinde gesagt, überhaupt nicht geil. :/

Umbau des Workers

Es gibt jedoch zum Glück die Möglichkeit, den Worker im Hintergrund laufen zu lassen.

  ▹ Einrichtung als Cronjob
  ▹ Einrichtung als Service-Daemon

Ich empfehle den Umbau bei jedem Shop vorzunehmen.
Es haben praktisch schon Server dadurch (mit diesem Bug) gebrannt und auch so, sehe ich regelmäßig Managed Server die komplett überlastet wurden und Kunden sich fragten, wieso der Shop nicht mehr ging.

Nachteil

Durch den Umbau läuft nur noch ein Worker, dadurch werden Messages auch langsamer bearbeitet.
Sollten nun also viele Arbeiten anstehen, benötigt dies entsprechend Zeit.

Als Beispiel wieder den Cache:

Wenn wir einen Shop mit 2.000 Artikel haben, werden ~200 Messages erstellt die abgearbeitet werden müssen.
Potenziell müssen andere Messages warten, bis diese durch sind, sofern nicht die Priorität anders gesetzt wurde.

Dokumentationen

• Symfony Dokumentation:
  ▹ https://symfony.com/doc/current/cloud/cookbooks/workers.html
• Shopware Dokumentation:
  ▹ https://docs.shopware.com/en/shopware-platform-dev-en/developer-guide/core/scheduled-tasks
  ▹ https://docs.shopware.com/en/shopware-platform-dev-en/developer-guide/core/message-queue


¹ https://community.hetzner.com/tutorials/install-shopware-6#step-6---configuring-background-queue-worker