Je nach Inventar ist möglicherweise eine Fragmentierung oder das Aufteilen von Feeds in mehrere Dateien erforderlich.
Wann wird die Fragmentierung verwendet?
Der Feed überschreitet nach der gzip-Komprimierung 200 MB für 1 Datei.
- Beispiel: Der generierte Verfügbarkeitsfeed beträgt 1 GB. Dies sollte in mehr als fünf separate Dateien (oder Fragmente) fragmentiert werden.
Partnerinventar wird auf Systeme und/oder Regionen verteilt, was zu Schwierigkeiten beim Inventarabgleich führt.
- Beispiel:Der Partner hat Inventar in den USA und der EU, das sich in separaten Systemen befindet. Der Feed kann mit 2 Dateien (oder Shards), 1 für die USA und 1 für EU mit denselben
nonce
undgeneration_timestamp
erstellt werden.
- Beispiel:Der Partner hat Inventar in den USA und der EU, das sich in separaten Systemen befindet. Der Feed kann mit 2 Dateien (oder Shards), 1 für die USA und 1 für EU mit denselben
Allgemeine Regeln
- Ein Shard kann für eine Datei nach der GZIP-Komprimierung 200 MB nicht überschreiten.
- Wir empfehlen, nicht mehr als 20 Fragmente pro Feed zu erstellen. Wenn es eine geschäftliche Begründung gibt, die mehr als diesen Betrag erfordert, wenden Sie sich bitte an den Support.
-
Einzelne Datensätze (z. B. ein
Merchant
-Objekt) müssen in einen Shard gesendet werden, da sie nicht auf mehrere Shards aufgeteilt werden können. Sie müssen jedoch für zukünftige Feeds nicht im Shard mit demselbenshard_number
gesendet werden. - Für eine bessere Leistung sollten die Daten gleichmäßig auf die Shards aufgeteilt werden, sodass alle Fragmente eine ähnliche Größe haben.
Feeds fragmentieren
Setze FeedMetadata
für jede Datei (oder Fragmentierung) auf Folgendes:
processing_instruction
aufPROCESS_AS_COMPLETE
gesetzt.shard_number
ist auf den aktuellen Shard des Feeds festgelegt (beginnt von 0 bistotal_shards
- 1 ohne Diskontinuitäten)total_shards
ist auf die Gesamtzahl der Shards für den Feed festgelegt (beginnend mit 1).nonce
ist eine eindeutige Kennung, die für alle Fragmente desselben Feeds identisch ist, aber vom Wert anderer Feeds abweicht.generation_timestamp
ist der Zeitstempel im Unix- und EPOCH-Format. Er sollte für alle Fragmente des Feeds identisch sein.
Empfohlen: Legen Sie für jede Datei (oder Shard) den Dateinamen fest, um den Feedtyp, den Zeitstempel, die Shard-Nummer und die Gesamtzahl der Shards anzugeben. Shards sollten ungefähr gleich groß sein und verarbeitet werden, 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
Es kann für Partner schwierig sein, das über mehrere Systeme und Regionen verteilte Inventar in einem Feed zu konsolidieren. Die Fragmentierung kann genutzt werden, um Probleme beim Abgleich zu lösen. Dazu wird jeder Shard so festgelegt, dass er mit dem Inventarsatz jedes verteilten Systems übereinstimmt.
Angenommen, das Inventar eines Partners ist in zwei Regionen (Inventar in den USA und in der EU) unterteilt, die sich in zwei separaten Systemen befinden.
Der Partner kann jeden Feed in zwei Dateien (oder Fragmente) 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
Führen Sie die folgenden Schritte aus, damit die Feeds korrekt verarbeitet werden:
- Legen Sie einen Uploadzeitplan fest und konfigurieren Sie jede Inventarinstanz so, dass sie dem Zeitplan entspricht.
- Weisen Sie jeder Instanz eindeutige Shard-Nummern zu (z.B. US = N, EU = N + 1).
Setzen Sie
total_shards
auf die Gesamtzahl der Shards. - Legen Sie bei jedem geplanten Upload einen
generation_timestamp
und einennonce
fest. Legen Sie inFeedMetadata
alle Instanzen fest, die dieselben Werte für diese beiden Felder enthalten.generation_timestamp
muss aktuell oder jünger als die Vergangenheit sein (idealerweise der Zeitstempel der Lesedatenbank des Partners)
- Nachdem alle Shards hochgeladen wurden, gruppiert Google die Shards über
generation_timestamp
undnonce
.
Google verarbeitet den Feed als einen Feed, obwohl jeder Shard eine andere Region des Partnerinventars darstellt und zu einer anderen Tageszeit hochgeladen werden kann, sofern generation_timestamp
für alle Shards gleich ist.
Beispiel für Fragmentierung des Verfügbarkeitsfeeds 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" } ] } ] }