Je nach Inventar kann es erforderlich sein, Feeds in mehrere Dateien aufzuteilen.
Wann sollte Sharding verwendet werden?
Der Feed ist für eine Datei (nach der GZIP-Komprimierung) größer als 200 MB.
- Beispiel:Der generierte Verfügbarkeitsfeed hat eine Größe von 1 GB. Die Datei sollte in mindestens fünf separate Dateien (oder Shards) aufgeteilt werden.
Partnerinventar ist auf Systeme und/oder Regionen verteilt, was die Abstimmung des Inventars erschwert.
- Beispiel:Ein Partner hat Inventar in den USA und der EU, das sich in separaten Systemen befindet. Der Feed kann mit zwei Dateien (oder Shards) generiert werden, einer für die USA und einer für die EU mit demselben
nonceundgeneration_timestamp.
- Beispiel:Ein Partner hat Inventar in den USA und der EU, das sich in separaten Systemen befindet. Der Feed kann mit zwei Dateien (oder Shards) generiert werden, einer für die USA und einer für die EU mit demselben
Allgemeine Regeln
- Jeder Shard darf für eine Datei (nach der Gzip-Komprimierung) maximal 200 MB groß sein.
- Wir empfehlen, nicht mehr als 20 Shards pro Feed zu verwenden. Wenn Sie aus geschäftlichen Gründen mehr als diesen 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 im Shard mit demselbenshard_numbergesendet werden. - Für eine bessere Leistung sollten Ihre Daten gleichmäßig auf die Shards aufgeteilt werden, sodass alle fragmentierten Dateien eine ähnliche Größe haben.
Feeds fragmentieren
Legen Sie für jede Datei (oder jeden Shard) FeedMetadata auf Folgendes fest:
processing_instructionaufPROCESS_AS_COMPLETEgesetzt.shard_numberist auf den aktuellen Shard des Feeds festgelegt (beginnend mit 0 bistotal_shards– 1 ohne Unterbrechungen).total_shardsist auf die Gesamtzahl der Shards für den Feed festgelegt (beginnend mit 1).nonceauf eine eindeutige Kennung festgelegt, die für alle Shards desselben Feeds identisch ist, sich aber vom Wert anderer Feeds unterscheidet.generation_timestampist der Zeitstempel im Unix- und EPOCH-Format. Dieser Wert sollte für alle Shards des Feeds gleich sein.
Empfohlen:Legen Sie für jede Datei (oder jeden Shard) den Dateinamen so fest, dass er den Feedtyp, den Zeitstempel, die Shard-Nummer und die Gesamtzahl der Shards angibt. Shards sollten ungefähr gleich groß sein und werden verarbeitet, sobald alle Shards hochgeladen wurden.
Example:“availability_feed_1574117613_001_of_002.json.gz”
Beispiel für einen Verfügbarkeitsfeed mit Sharding
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"
}
]
}
]
}Sharding für von Partnern bereitgestelltes Inventar verwenden
Es kann für Partner schwierig sein, Inventar, das auf mehrere Systeme und/oder Regionen verteilt ist, in einem einzigen Feed zusammenzufassen. Mit Sharding lassen sich Abstimmungsprobleme beheben, indem jeder Shard auf das Inventarset des jeweiligen verteilten Systems abgestimmt wird.
Angenommen, das Inventar eines Partners ist in zwei Regionen (Inventar für die USA und die EU) unterteilt, die sich in zwei separaten Systemen befinden.
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
Gehen Sie die folgenden Schritte durch, um sicherzustellen, dass die Feeds richtig verarbeitet werden:
- Legen Sie einen Upload-Zeitplan fest und konfigurieren Sie jede Inventarinstanz so, dass sie diesem Zeitplan folgt.
- Weisen Sie jeder Instanz eindeutige Shard-Nummern zu (z.B. US = N, EU = N + 1).
Legen Sie
total_shardsauf die Gesamtzahl der Shards fest. - Legen Sie für jeden geplanten Uploadzeitpunkt ein
generation_timestampund einnoncefest. Legen Sie in derFeedMetadatafür alle Instanzen dieselben Werte für diese beiden Felder fest.generation_timestampsollte das aktuelle Datum oder ein Datum in der jüngsten Vergangenheit sein (idealerweise der Zeitstempel der Datenbank des Partners).
- Nachdem alle Shards hochgeladen wurden, gruppiert Google sie über
generation_timestampundnonce.
Google verarbeitet den Feed als einen, obwohl jeder Shard eine andere Region des Inventars des Partners darstellt und zu einer anderen Tageszeit hochgeladen werden kann, solange die generation_timestamp für alle Shards gleich ist.
Beispiel für einen nach Region aufgeteilten Verfügbarkeitsfeed
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"
}
]
}
]
}