A seconda dell'inventario, potrebbe essere necessario eseguire lo sharding (o suddividere i feed in più file).
Quando utilizzare lo sharding
Il feed supera i 200 MB per 1 file (dopo la compressione gzip).
- Esempio: il feed di disponibilità generato è di 1 GB. Deve essere suddiviso in almeno 5 file (o shard) separati.
L'inventario del partner è distribuito su sistemi e/o regioni, il che rende difficile la riconciliazione dell'inventario.
- Esempio: il partner ha un inventario per gli Stati Uniti e per l'UE in sistemi distinti. Il feed può essere generato con 2 file (o shard), 1 per gli Stati Uniti e 1 per l'UE con gli stessi
nonce
egeneration_timestamp
.
- Esempio: il partner ha un inventario per gli Stati Uniti e per l'UE in sistemi distinti. Il feed può essere generato con 2 file (o shard), 1 per gli Stati Uniti e 1 per l'UE con gli stessi
Regole generali
- Ogni frammento non può superare i 200 MB per 1 file (dopo la compressione gzip).
- Consigliamo di non utilizzare più di 20 frammenti per feed. Se hai una motivazione commerciale che richiede un importo superiore, contatta l'assistenza per ulteriori istruzioni.
-
I singoli record (ad esempio un oggetto
Merchant
) devono essere inviati in un unico shard e non possono essere suddivisi in più shard. Tuttavia, non devono essere inviati nel frammento con lo stessoshard_number
per i feed futuri. - Per migliorare le prestazioni, i dati devono essere suddivisi in modo uniforme tra gli shard in modo che tutti i file suddivisi in shard abbiano dimensioni simili.
Come suddividere i feed
Per ogni file (o frammento), imposta FeedMetadata
su quanto segue:
processing_instruction
impostato suPROCESS_AS_COMPLETE
.shard_number
impostato sul frammento corrente del feed (da 0 atotal_shards
- 1 senza discontinuità)total_shards
impostato sul numero totale di shard per il feed (a partire da 1).nonce
impostato su un identificatore univoco uguale in tutti gli shard dello stesso feed, ma diverso dal valore di altri feed.nonce
deve essere un numero intero positivo (uint64
).generation_timestamp
è il timestamp in formato Unix ed EPOCH. Deve essere uguale in tutti gli shard del feed.
Consigliato:per ogni file (o frammento), imposta il nome del file in modo da indicare il tipo di feed, il timestamp, il numero di frammento e il numero totale di frammenti. I frammenti devono avere dimensioni approssimativamente uguali e vengono elaborati una volta caricati tutti.
Example:
“availability_feed_1574117613_001_of_002.json.gz”
Esempio di feed di disponibilità suddiviso in parti
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" } ] } ] }
Utilizzo dello sharding per l'inventario distribuito dai partner
Per i partner può essere difficile consolidare l'inventario distribuito su più sistemi e/o regioni in un unico feed. Lo sharding può essere utilizzato per risolvere i problemi di riconciliazione impostando ogni shard in modo che corrisponda all'insieme di inventari di ciascun sistema distribuito.
Ad esempio, supponiamo che l'inventario di un partner sia suddiviso in due regioni (inventario degli Stati Uniti e dell'UE), che si trovano in due sistemi separati.
Il partner può suddividere ogni feed in 2 file (o shard):
- Feed dei commercianti: 1 shard per gli Stati Uniti, 1 shard per l'UE
- Feed di servizi: 1 shard per gli Stati Uniti, 1 shard per l'UE
- Feed di disponibilità: 1 shard per gli Stati Uniti, 1 shard per l'UE
Per assicurarti che i feed vengano elaborati correttamente, segui i passaggi riportati di seguito:
- Scegli una pianificazione dei caricamenti e configura ogni istanza dell'inventario in modo che rispetti la pianificazione.
- Assegna numeri di shard univoci per ogni istanza (ad es. US = N, EU = N + 1).
Imposta
total_shards
sul numero totale di shard. - Per ogni ora di caricamento pianificata, scegli un valore per
generation_timestamp
enonce
. InFeedMetadata
, imposta tutte le istanze in modo che contengano gli stessi valori per questi due campi.generation_timestamp
deve essere attuale o recente (idealmente, il timestamp del database di lettura del partner)
- Una volta caricati tutti i frammenti, Google li raggruppa tramite
generation_timestamp
enonce
.
Google elaborerà il feed come un unico feed anche se ogni frammento rappresenta una regione diversa dell'inventario del partner e potrebbe essere caricato in un momento diverso della giornata, purché generation_timestamp
sia lo stesso in tutti i frammenti.
Esempio di feed di disponibilità suddiviso in parti per regione
Shard 0 - Inventario Stati Uniti
{ "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 - Inventario UE
{ "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" } ] } ] }