Magento-Import-Geschwindigkeit von Artikeln

Import-Geschwindigkeit von Artikeln in Magento (2)

Nachdem es im ersten Teil dieses Beitrags um die allgemeinen Performance Tipps ging, betrachten wir in der heutigen Fortsetzung zum Thema „Import-Geschwindigkeit von Artikeln in Magento“ die schnellste Methode zur Steigerung der Performance anhand eines Beispiels.

  1. SOAP v1: Multi-Calls verwenden
  2. SOAP v2: WSDL-Cache aktivieren
  3. Import/Export-Schnittstelle: partielle Indizierung deaktivieren
  4. Setup
  5. Getestete Varianten
  6. Ergebnisse
  7. Fazit
  8. Über den Autor
  9. Links

SOAP v1: Multi-Calls verwenden

Wer sich für die SOAP-Schnittstelle entscheidet und die Möglichkeit hat, die SOAP-v1-Schnittstelle zu verwenden, kann auf das so genannte multiCall-Feature [3] zurückgreifen, um die Geschwindigkeit zu verbessern.

Normalerweise wird für jeden SOAP-Call eine Verbindung zu Magento aufgebaut. Durch den Overhead für die HTTP-Verbindung, den Start des Magento-Frameworks etc. kann der Import beträchtlich verlangsamt werden.

Beim Multi-Call hingegen werden mehrere Befehle über einen einzelnen SOAP-Aufruf übertragen. Das Setup der Verbindung wird somit nur einmal durchgeführt und der Vorgang beschleunigt.

SOAP v2: WSDL-Cache aktivieren

Ein weiterer Kniff für den Import via SOAP ist die Aktivierung des WSDL-Caches. Während für die v1-Schnittstelle kein Unterschied feststellbar ist, kann die Performance der v2-Schnittstelle stark leiden, wenn der Cache nicht aktiviert ist.

Im Gegensatz zu den restlichen Cache-Einstellungen findet ihr diesen Punkt im Backend nicht unter „System > Cache Management“, sondern unter „System > Configuration > Services > Magento Core API > General Settings > Enable WSDL Cache“.

Import/Export-Schnittstelle: partielle Indizierung deaktivieren

Während die bisher genannten Optimierungen mehr oder weniger effektiv sind, erhaltet ihr den größten Geschwindigkeits-Schub, wenn ihr das Import-/Export-Modul von Magento verwendet. Es wurde in der Community Edition mit Version 1.5 und der Enterprise Edition mit Version 1.13 eingeführt.

Anstatt den umständlichen Weg über Magento-Models zu gehen, schreibt dieses Modul die Produktdaten wesentlich direkter in die Datenbank. Im Gegensatz zu kostenpflichtigen Extensions von Dritt-Anbietern, die bereits länger auf dem Markt sind, handelt es sich hierbei um ein Core-Modul. Es sollte also immer mit der aktuell verwendeten Version von Magento zusammenarbeiten, ohne dass ihr euch Sorgen um die Kompatibilität und geänderte Datenbank-Schemen machen müsst.

Normalerweise wird die Import/Export-Schnittstelle mittels CSV-Dateien im Backend verwendet. Da sich dieser Weg für Automatisierungen nicht eignet und das Daten-Format zudem umständlich aufgebaut ist, hat Andreas von Studnitz mit AvS_FastSimpleImport [4] eine nützliche Extension erstellt. Mit ihr lassen sich Daten über Arrays importieren. Das vereinfacht die Arbeit für Entwickler und erlaubt es, den Vorgang zu automatisieren.

Für eine gute Performance solltet ihr darauf achten, dass die partielle Indizierung des Importers deaktiviert ist:

$import = Mage::getModel(‚fastsimpleimport/import‘);

$import->setPartialIndexing(false);

Benchmark

Um Beispiel-Zahlen bieten zu können, habe ich einen Geschwindigkeitstest mit Magento CE 1.7.0.2 gestartet.

Setup

Dazu habe ich mittels VirtualBox eine kleine virtuelle Maschine mit Debian Squeeze, 2 Prozessoren und 1,5 GB RAM erstellt. Als Webserver dient Apache, als Datenbankserver kommt MySQL zum Einsatz. PHP 5.3 wurde mit APC-Cache versehen. Die wichtigsten Konfigurationsoptimierungen für Apache, MySQL, PHP und APC wurden vorgenommen, um den Import nicht unnötig auszubremsen.

Eine frische Installation von Magento CE 1.7.0.2 wurde um zwei Extensions ergänzt:

  • Aoe_AsyncCache [5]: verzögert das Löschen von Caches, indem der Lösch-Befehl nicht direkt ausgeführt, sondern die Löschbefehle in eine Warteschlange geschrieben, gegebenenfalls gruppiert und später gesammelt über den Cronjob ausgeführt werden.
  • AvS_FastSimpleImport: Die Extension für die Verwendung der Import-/Export-Schnittstelle.

Abgesehen davon wurde das normale Setup beibehalten. Als Cache dient also der normale File-Cache. Für SOAP v2 wurde der WSDL-Cache aktiviert.

Getestete Varianten

Ich habe in meinen Tests vier Import-Varianten gegenübergestellt:

  • SOAP v1
  • SOAP v2 mit WSI-Compliance
  • SOAP v1 mit Multi-Call
  • Import/Export-Modul mittels AvS_FastSimpleImport

Die Varianten wurden mit vier unterschiedlichen Einstellungen getestet:

  • Indizierung automatisch, Caching deaktiviert
  • Indizierung automatisch, Caching aktiviert
  • Indizierung manuell, Caching deaktiviert
  • Indizierung manuell, Caching aktiviert

Um eventuelle Schwankungen auszugleichen, habe ich diesen Durchlauf 3-mal wiederholt und die Werte gemittelt. Insgesamt war die Varianz sehr gering. Es sollte also keine großen Störfaktoren gegeben haben. Zwischen den Durchläufen wurde die Datenbank auf den Originalzustand zurückgesetzt, alle Caches geleert und die Startseite einmal aufgerufen, um gegebenenfalls die Magento-Basis-Caches vorzubefüllen. Das Skript dafür möchte ich in den nächsten Wochen über meinen GitHub-Account [7] verfügbar machen.

Pro Durchlauf wurden 1.000 simple Produkte importiert. Die Produkte wurden einer von drei Kategorien zugeordnet. Produktbilder wurden nicht hinzugefügt. Außerdem wurden nur die wichtigen Standard-Attribute von Magento befüllt.

Ergebnisse

Wie immer gilt: Traut keiner Statistik, die ihr nicht selbst gefälscht habt. Die Zahlen können als Anreiz für euch dienen, mit eurem Import zu experimentieren. Abhängig von eurem Server, eurer Anbindung, eurem Magento-Setup und euren Produkt-Daten werdet ihr andere Ergebnisse erhalten, als ich es getan habe. Daher habe ich mich auf das Verhältnis zwischen den unterschiedlichen Import-Typen und Einstellungen konzentriert, nicht auf die absoluten Zahlen.

Hier sehen wir alle Konstellationen im Vergleich:

Balkendiagramm mit Import-Typen und Geschwindigkeit

Die langsamsten Varianten sind der SOAP-v1- und SOAP-v2-Import mit automatischer Indizierung und aktiviertem Caching. Nehmen wir die Geschwindigkeit dieser Importe als Ausgangsbasis, dann sehen wir, dass die Import/Export-Schnittstelle locker die 100-fache Geschwindigkeit erreicht. De facto war in meinem Test AvS_FastSimpleImport mit manueller Indizierung und aktiviertem Caching 182-mal so schnell wie das langsamste Szenario. Auch wenn nachher die Daten einmalig indiziert werden müssen: Import/Export zahlt sich auf jeden Fall aus.

Was wir aus dem Überblick lernen können:

  • Wenn möglich solltet ihr die Import/Export-Schnittstelle verwenden.
  • Sowohl die Aktivierung des Caches als auch die Deaktivierung der automatischen Indizierung bringt nochmals einen gehörigen Schub.
  • Falls das nicht möglich ist, solltet ihr die SOAP-v1-Schnittstelle mit Multi-Call ins Visier nehmen.
  • Einfache SOAP-Calls, egal ob v1 oder v2, sind um Größenordnungen langsamer.

Werfen wir nun einen näheren Blick auf die SOAP-Varianten:

Auch hier lassen sich einige Erkenntnisse aus den Zahlen gewinnen.

  • SOAP-v1-Multi-Calls mit manueller Indizierung sind immer noch gut 12-mal so schnell wie einfache SOAP-Calls mit automatischer Indizierung und mehr als 6-mal so schnell wie einfache SOAP-Calls mit manueller Indizierung.
  • Die manuelle Indizierung bringt für einfache SOAP-v1- und SOAP-v2-Calls einen Performance-Gewinn von ca. 25 bis 40 Prozent. SOAP-v1-Multi-Calls beschleunigt sie um das Dreifache.
  • Der Cache war für den Import in CE 1.7.0.2 – entgegen früheren Tests von mir mit älteren Versionen – für einfache SOAP-Calls kontraproduktiv. Hier scheint es besser zu sein, den Cache zu deaktivieren. Multi-Calls schadeten dem Cache zwar nicht, der Performance-Unterschied war aber minimal.

Fazit

Wenn möglich solltet ihr für gute Import-Performance die Import-/Export-Schnittstelle verwenden. Wie erwähnt wird hier zugunsten der Performance nicht der normale Ablauf einer Produktspeicherung durchlaufen. Deswegen kommt diese Variante leider nicht immer in Frage, zum Beispiel wenn Produktattribute aufgrund anderer Informationen und Einstellungen dynamisch berechnet werden.

Der Zugriff über SOAP mit Multi-Calls liefert ebenfalls eine gar nicht so schlechte Performance. Nachteil ist, dass Multi-Calls über die v1-Schnittstelle laufen und sie daher für andere Programmiersprachen eingeschränkt bis gar nicht tauglich sind.

Seid ihr auf die Arbeit mit einfachen SOAP-Calls angewiesen, habt ihr leider nur geringe Optimierungsmöglichkeiten. Die Reduzierung von Aufrufen und das Tuning einzelner Parameter stehen hier im Vordergrund.

Als letzte Alternative bleibt der Einsatz von 3rd-Party-Extensions oder das Schreiben eigener Erweiterungen. In beiden Fällen gilt: Je nachdem wie weit der Standard-Magento-Weg umgangen wird, kann großer Aufwand nötig sein, um den Code bzw. die resultierenden Daten mit der verwendeten Magento-Version kompatibel zu halten. Implementiert ihr alle Funktionalitäten von Magento, dann bleibt häufig kein nennenswerter Geschwindigkeitszuwachs mehr übrig. Der gangbarste Weg ist hier die Entwicklung spezieller Aufrufe, die kleine Teilaufgaben besonders gut erledigen können (z. B. die massenhafte Aktualisierung von Lagerbestandsdaten).

Über den Autor

Matthias Zeis ist Magento Certified Developer und beschäftigt sich seit 2009 mit Magento. Er lebt in Wien und arbeitet bei LimeSoda als Entwickler und technischer Projektleiter.

[2]

[3]

Kommentare

  1. Niedergesäß am

    Sehr geehrter Herr Zeis, ist die SOAP Schnittstelle V2 auch für die Communityversion geeignet und wenn ja welche Limits hat diese in Bezug auf das Szenario: Artikelimport (auch Stücklisten), sowie Artikel-Katalogzuordnung (Baumstruktur). Abholen von Aufträgen. Ist es richtig, dass die Compunityversion beim Artikelimport alle Artikel bzw. indizes zunächst löschen muss so dass diese nicht während eines Imports findbar sind?

    Unsere WaWi ist in Delphi erstellt, eine Shopschnittstelle welche XML Artikel und Aufträge bedient gibt es als VBSCRIPT-Host. Ideal wäre es wenn man hierzu über SOAP einfach eine Erweiterung des VB-Layers mit der SOAP-Kommunikation realisieren könnte, ohne dass auf dem Magentoserver, Fremdsoftware installiert erden müsste.

    mfg
    Chr. Niedergesäß

    Antworten

Kommentar hinzufügen