Backend-Performance beim gleichzeitigen Hinzufügen zahlreicher Artikel zum Warenkorb

Hallo zusammen, 

dieser Thread soll ein Gedankenaustausch sein über die Backend-Performance im genannten Fall des gleichzeitigen Hinzufügens einer Vielzahl von Artikeln. 

Um das überhaupt ermöglichen zu können, habe ich ein Plugin geschrieben, das die Produkt-Detailseite um die Varianten erweitert, damit man direkt die gewünschten Mengen zusammenstellen kann. Frontendseitig konnte ich ausreichend optimieren, zum Beispiel durch den Austausch der Select-Option-Felder durch reguläre Input-Felder. 

Mit meinem Vorgehen habe ich jedoch wohl den von Shopware erdachten Pfad verlassen (immer einzelne Produkte hinzuzufügen).

Ich stoße in der Folge im Backend auf große Performance-Probleme hinter dem Endpunkt frontend.checkout.line-item.add. Der Endpunkt nimmt die gesamte Datenmenge auf und zerlegt sie in einzelne Teilaufgaben. Diese Teilaufgaben summieren sich zu einer enormen Menge von Queries gegen die Datenbank: aus ca. 90 hinzugefügten Varianten werden ca. 670 Datenbank-Anfragen und -Inserts. Die Select-Queries sind sehr groß und einzeln betrachtet sehr zeitaufwendig. Auch wird bisher nichts im Speicher vorbereitet, um dann zum Beispiel einen Gesamt-Insert in die Cart vorzunehmen, was vermutlich auch schneller laufen könnte.  

Aus diesem Grund möchte ich gerne erfahren, ob auch andere Shopware-User oder -Entwickler meinen Anwendungsfall auf dem Schirm haben. Vielleicht gibt es ja einen Lösungsansatz, den ich bisher nicht bedacht habe, oder es gibt vielleicht bei Shopware bereits Optimierungen an dieser Schnittstelle. 

Vielen Dank für Eure Informationen, Meinungen und Anregungen! 

Anbei noch Screenshots der Request-Laufzeit bei 91 Produkten und exemplarisch einen einzelnen Insert in die Cart.

Bis der Request vollständig beantwortet wird, vergehen ca. 16s.

 

Nur mal so zum Vergleich, wie ist denn die Performance wenn du einfach alle mit einzelnen Requests in den Warenkorb legst?

@csrn schrieb:

image image

Anbei noch Screenshots der Request-Laufzeit bei 91 Produkten und exemplarisch einen einzelnen Insert in die Cart.

Bis der Request vollständig beantwortet wird, vergehen ca. 16s.

 

Mit was für einen Tool wertest Du das aus?  Smile 

Hallo zusammen

@Murmeltier‍ : Das ist die DBAL-Request-Analyse von Symfonie im DEV-Modus des Shops (lokal)
@aggrosoft: Du meinst eine Sequenz von einzelnen Requests mit jeweils einem Produkt? Das habe ich bisher nicht getan, weil der Sourcecode am Endpunkt recht eindeutig die Payload in einzelne Produkte aufteilt und diese dann sequenziell abarbeitet. 
Schau mal in vendor/shopware/storefront/Controller/CartLineItemController.php in die Funktion addLineItems. Dort siehst Du die foreach-Schleife. Für jedes Produkt einen HTTP-Request zu starten, würde den Overhead noch deutlich vergrößern. 

Hi @csrn‍,
Vielen Dank für den Hinweis. Ich hab mir das Problem angeschaut, nachgestellt und einen Fix dafür bereit gestellt. Bei mir lokal hab ich das ganze zwar nicht über die Route aber mit einem kleinen PHP Script nachgestellt. Bei 500 Items brauch der „single-add“ 80 sekunden, mit einer riesigen Masse an Queries. Ich habe die Funktionen jetzt so umgebaut, dass sie mehrere LineItems entgegen nehmen und dementsprechend weiter reichen. Bei 500 Produkten komme ich dann auf 250ms PHP Execution. 

Hier der entsprechende Commit: 
Merge branch 'ntr/cart-optimize' into 'master' · shopware/platform@1acb9da · GitHub

Gruß Oliver
 

1 „Gefällt mir“

Hallo [@Oliver Skroblin](http://forum.shopware.com/profile/1871/Oliver Skroblin “Oliver Skroblin”)‍ ‍!

Vielen Dank für Deine großartige Unterstützung!

Mein Shop basiert auf der Version 6.2.3, und bei der Prüfung meiner Shopware-Sources sehe ich, dass sich die Funktion

public function add(Cart $cart, LineItem $item, SalesChannelContext $context): Cart
in vendor/shopware/core/Checkout/Cart/SalesChannel/CartService.php

im Master-Branch bereits stark verändert hat. 
https://github.com/shopware/platform/blob/1acb9da5ed6b19f96a71aa586d90ecdcf754a8e6/src/Core/Checkout/Cart/SalesChannel/CartService.php#L135
Insgesamt hat sich sehr viel in der CartService.php getan, weshalb ich einen schnellen Test lokal bei mir mit dem bestehenden Shop-System nicht durchführen kann.

Weißt Du vielleicht, wann diese Änderung im Master publiziert werden wird? Kommt das eventuell schon in 6.2.4?