Je nach Inventar kann es notwendig sein, die Feeds zu fragmentieren oder die Feeds in mehrere Dateien aufzuteilen.
Wann sollte die Fragmentierung verwendet werden?
Der Feed überschreitet 200 MB für 1 Datei (nach der GZIP-Komprimierung).
- Beispiel: Der generierte Verfügbarkeitsfeed ist 1 GB groß. Dies sollte in mehr als 5 separate Dateien (oder Shards) aufgeteilt werden.
Partnerinventar wird auf Systeme und/oder Regionen verteilt, was zu Schwierigkeiten beim Abgleich des Inventars führt.
- Beispiel: Der Partner hat Inventar in den USA und in der EU, das sich in separaten Systemen befindet. Der Feed kann mit 2 Dateien (oder Shards) erstellt werden: 1 für die USA und einer für die EU mit denselben
nonce
undgeneration_timestamp
.
- Beispiel: Der Partner hat Inventar in den USA und in der EU, das sich in separaten Systemen befindet. Der Feed kann mit 2 Dateien (oder Shards) erstellt werden: 1 für die USA und einer für die EU mit denselben
Allgemeine Regeln
- Ein Shard darf für eine Datei (nach der gzip-Komprimierung) nicht größer als 200 MB sein.
- Wir empfehlen nicht mehr als 20 Shards pro Feed. Wenn Sie aus geschäftlichen Gründen einen höheren Betrag benötigen, wenden Sie sich bitte an den Support.
-
Einzelne Datensätze (z. B. ein
Merchant
-Objekt) müssen in einem Shard gesendet werden. Sie können nicht auf mehrere Shards aufgeteilt werden. Für zukünftige Feeds müssen sie jedoch nicht mit derselbenshard_number
im Shard gesendet werden. - Für eine bessere Leistung sollten die Daten gleichmäßig auf die Shards aufgeteilt werden, damit alle fragmentierten Dateien eine ähnliche Größe haben.
Feeds fragmentieren
Legen Sie für jede Datei (oder jeden Shard) für FeedMetadata
Folgendes fest:
processing_instruction
aufPROCESS_AS_COMPLETE
festgelegt.shard_number
auf den aktuellen Shard des Feeds festgelegt ist (beginnend von 0 bistotal_shards
- 1 ohne Unterbrechungen)total_shards
ist auf die Gesamtzahl der Shards für den Feed festgelegt (beginnend mit 1).nonce
ist auf eine eindeutige Kennung festgelegt, die für alle Shards desselben Feeds gleich ist, sich jedoch vom Wert anderer Feeds unterscheidet.generation_timestamp
ist der Zeitstempel im Unix- und EPOCH-Format. Er sollte für alle Shards des Feeds gleich sein.
Empfohlen: Legen Sie für jede Datei (oder jeden Shard) den Dateinamen fest, um den Feedtyp, den Zeitstempel, die Shard-Nummer und die Gesamtzahl der Shards anzugeben. Shards sollten in etwa gleich groß sein und werden verarbeitet, sobald alle Shards hochgeladen sind.
Example:
“availability_feed_1574117613_001_of_002.json.gz”
Beispiel für einen fragmentierten Verfügbarkeitsfeed
Shard 0
{ "metadata": { "processing_instruction": "PROCESS_AS_COMPLETE", "shard_number": 0, "total_shards": 3, "nonce": "111111", "generation_timestamp": 1524606581 }, "service_availability": [ { "availability": [ { "spots_total": 1, "spots_open": 1, "duration_sec": 3600, "service_id": "1000", "start_sec": 1577275200, "merchant_id": "merchant1", "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS" } ] } ] }
Shard 1
{ "metadata": { "processing_instruction": "PROCESS_AS_COMPLETE", "shard_number": 1, "total_shards": 3, "nonce": "111111", "generation_timestamp": 1524606581 }, "service_availability": [ { "availability": [ { "spots_total": 1, "spots_open": 1, "duration_sec": 3600, "service_id": "1000", "start_sec": 1577620800, "merchant_id": "merchant2", "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS" } ] } ] }
Shard 2
{ "metadata": { "processing_instruction": "PROCESS_AS_COMPLETE", "shard_number": 2, "total_shards": 3, "nonce": "111111", "generation_timestamp": 1524606581 }, "service_availability": [ { "availability": [ { "spots_total": 1, "spots_open": 1, "duration_sec": 3600, "service_id": "1000", "start_sec": 1576670400, "merchant_id": "merchant3", "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS" } ] } ] }
Fragmentierung für verteiltes Inventar von Partnern verwenden
Für Partner kann es schwierig sein, Inventar, das auf mehrere Systeme und/oder Regionen verteilt ist, in einem einzigen Feed zusammenzufassen. Sharding kann verwendet werden, um Probleme beim Abgleich zu lösen, indem jeder Shard so festgelegt wird, dass es dem Inventarsatz jedes verteilten Systems entspricht.
Beispiel: Das Inventar eines Partners ist in zwei Regionen (Inventar für die USA und die EU) aufgeteilt, die wiederum in zwei separaten Systemen vorhanden sind.
Der Partner kann jeden Feed in zwei Dateien (oder Shards) aufteilen:
- Händlerfeed: 1 Shard für die USA, 1 Shard für die EU
- Dienstleistungsfeed: 1 Shard für die USA, 1 Shard für die EU
- Verfügbarkeitsfeed: 1 Shard für die USA, 1 Shard für die EU
So sorgen Sie dafür, dass die Feeds richtig verarbeitet werden:
- Legen Sie einen Uploadzeitplan fest und konfigurieren Sie jede Inventarinstanz entsprechend dem Zeitplan.
- Weisen Sie jeder Instanz eindeutige Shard-Nummern zu (z.B. US = N, EU = N + 1).
Legen Sie für
total_shards
die Gesamtzahl der Shards fest. - Entscheide dich zu jeder geplanten Uploadzeit für
generation_timestamp
undnonce
. Legen Sie inFeedMetadata
fest, dass alle Instanzen dieselben Werte für diese beiden Felder enthalten.generation_timestamp
muss aktuell sein oder in der Vergangenheit liegen (idealerweise der Zeitstempel des Datenbanklesevorgangs des Partners)
- Nachdem alle Shards hochgeladen wurden, gruppiert Google die Shards über
generation_timestamp
undnonce
.
Google verarbeitet den Feed, obwohl jeder Shard eine andere Region des Partnerinventars darstellt und zu einer anderen Tageszeit hochgeladen werden kann, solange die generation_timestamp
in allen Shards gleich ist.
Beispiel für einen fragmentierten Verfügbarkeitsfeed nach Region
Shard 0 - US-Inventar
{ "metadata": { "processing_instruction": "PROCESS_AS_COMPLETE", "shard_number": 0, "total_shards": 2, "nonce": "111111", "generation_timestamp": 1524606581 }, "service_availability": [ { "availability": [ { "spots_total": 1, "spots_open": 1, "duration_sec": 3600, "service_id": "1000", "start_sec": 1577275200, "merchant_id": "US_merchant_1", "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS" } ] } ] }
Shard 1 - EU-Inventar
{ "metadata": { "processing_instruction": "PROCESS_AS_COMPLETE", "shard_number": 1, "total_shards": 2, "nonce": "111111", "generation_timestamp": 1524606581 }, "service_availability": [ { "availability": [ { "spots_total": 1, "spots_open": 1, "duration_sec": 3600, "service_id": "1000", "start_sec": 1577620800, "merchant_id": "EU_merchant_1", "confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS" } ] } ] }