A/B-Switch der Shoptabellen

Bestimmung der aktiven bzw. inaktiven Tabellen

Im Frontend wird nur mit den aktiven Tabellen gearbeitet. Im CRON und im Backend erfolgt das Einlesen der Datwn jeweils in die inaktiven Tabellen. Nach erfolgreichem Abschluss der zugehörigen Funktionen, wird die Tabelle neue Tabelle zur aktiven und die bisherige Tabelle inaktiv.

Inaktive Tabellen werden nach erfolgreicher Umschaltung sofort gelöscht.

Über den Parameter GLOBAL_PARAM_KEEP_INACTIV_TABLE = 1, kann das sofortige Löschen vorübergehend ausgesetzt werden. Dies eröht allerdings den Speicherbedarf für die Datenbank auf nahezu das Doppelte.

Für die Bestimmung der jeweils aktiven bzw. inaktiven Tabellen (Shop, Domain, Menu usw.) wird die Funktion  

db_get_activ_table($id, $type, $status='1') 
Datei: includes/functions/switch_functions.php

verwendet.

Diese Funktion gibt den Suffix _a bzw. _b für die aktive Tabelle zurück, bzw. der inaktiven wenn $status = 0 übergeben wird.

In den Funktionen im CRON und im Backend wird diese Funktion nicht direkt aufgerufen, sondern es werden für eine bessere Lesbarkeit der Programme die Funktionen

db_get_activ_shop_table($shop_id)

und

db_get_inactiv_shop_table($shop_id)

verwendet.

Aktualisierung der Produkte pro Shop

Das Einlesen der Daten erfolgt jeweils in die nicht aktive Tabelle. Dabei wird die Shop-Tabelle immer neu erstellt!

Nur beim Import der Produktdaten je Kategorie über die API (erfolgt nur bei Problemen mit dem CSV-Import) - wäre es sinnvoll die inaktive Shop-Tabelle nicht zu löschen, sondern zu prüfen, ob die Daten noch aktuell sind - und dann an dieser Stelle fortzusetzen. Der Datenimport über die API bei sehr großen Datenbeständen kann 1- 2 Stunden dauern!

Aktueller Stand: prinzipiell sollte das bisher parktizierte Laden der Shopdaten über die API - auch nach der Umstellung funktionieren - wurde aber nicht gestestet da, derzeit keine - nicht lösbaren - Probleme im CSV-Import aufgetreten sind.

Aktivierung der neuen Shop-Tabellen

Wenn das Holen der Daten erfolgreich war, werden soweit erforderlich noch Indizies erstellt. Die Indizies für die id, m_cat_id, program_id und shop_id - werden aktuell bereits beim Einlesen erstellt, ggf. zusätzliche Indizies (wenn laut der abschließenden Tests erforderlich) würden jetzt gesetzt werden. Anschließend wird die aktive Shoptabelle in der Tabelle activ_table_shop geändert.

Dies erfolgt mit dem Aufruf der Funktion:

switch_shop($shop_id)
Datei: includes/functions/cron_functions_switch_shop.php

Dabei werden außer dem Switch der Shop-Tabelle,

db_switch_table($id, $type='shop')
Datei: includes/functions/switch_functions.php

noch weitere Funktionen ausgeführt:

  • Aktualisierung der Anzahl der Produkte in der Datenbank in der Shop-Übersicht (Anzeige Im Backend - Domain - Shops).
  • Löschen der inaktiven Shop-Tabelle

Diese Änderung wirkt sich sofort auf das Frontend aus.

D.h. dort wo Felder aus der shop_-Tabelle verwendet werden und ein Produkt dazu nicht mehr vorhanden ist, werden diese Daten nicht mehr angezeigt.

Dadurch  kann es kurzfristig bis zur Neuerstellung der Domain-Tabellen zu Abweichungen in der Anzahl der Produkte kommen, weil die Ermittlung der Reihenfolge der angezeigten Produkte - jeweils abwechselnd ein Produkt pro Shop - nur auf Basis der Domain-Tabellen erfolgt. (Eine kombinierte Abfrage mit group by hätte deutlich längere Seitenladezeiten beim ersten Aufruf zur Folge).

Wird nach der Shop-Aktualisierung für ein eben noch vorhandenes Produkt - auf einen Link zum Shop geklickt, so wird dieser Link, auf die Startseite (Produkt nicht gefunden) umgeleitet. Anderenfalls würde der Link entweder bei Affilinet abgefangen oder im entsprechendem Shop - Produkt nicht gefunden - aufrufen. D.h. hier geht nichts verloren.

^