A seconda dell'inventario, potrebbe essere necessario partizionare (o suddividere i feed in più file)
Quando utilizzare il partizionamento orizzontale
Il feed supera i 200 MB per 1 file (dopo la compressione gzip).
- Esempio: il feed di disponibilità generato è di 1 GB. Questo deve essere suddiviso in più di 5 file (o shard) separati.
L'inventario dei partner è distribuito in sistemi e/o aree geografiche con difficoltà di riconciliazione dell'inventario.
- Esempio: il partner ha un inventario negli Stati Uniti e nell'UE che vive in sistemi separati. 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 negli Stati Uniti e nell'UE che vive in sistemi separati. 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 shard non può superare 200 MB per 1 file (dopo la compressione gzip).
- Ti consigliamo di non inserire più di 20 shard per feed. Se disponi di una giustificazione aziendale che richiede più di tale importo, contatta l'assistenza per ulteriori istruzioni.
-
I singoli record (un oggetto
Merchant
ad esempio) devono essere inviati in uno shard e non possono essere suddivisi in più shard. Tuttavia, non devono essere inviati nello shard 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 con sharding abbiano dimensioni simili.
Come eseguire lo sharding dei feed
Per ogni file (o shard) imposta FeedMetadata
come segue:
processing_instruction
impostato suPROCESS_AS_COMPLETE
.shard_number
impostato sullo shard corrente del feed (a partire da 0 contotal_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 che è lo stesso in tutti gli shard dello stesso feed ma diverso dal valore degli altri feed.generation_timestamp
è il timestamp in formato Unix ed EPOCH. Deve essere lo stesso in tutti gli shard del feed.
Consigliato: per ciascun file (o shard) imposta il nome file per indicare il tipo di feed, il timestamp, il numero dello shard e il numero totale di shard. Gli shard dovrebbero avere all'incirca le stesse dimensioni ed essere elaborati una volta caricati tutti gli shard.
Example:
"availability_feed_1574117613_001_of_002.json.gz"
Esempio di feed Disponibilità con blocco
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 dei partner
Può essere difficile per i partner consolidare l'inventario distribuito su più sistemi e/o aree geografiche in un unico feed. È possibile utilizzare lo sharding per risolvere le sfide di riconciliazione impostando ogni shard in modo che corrisponda all'inventario dell'insieme di ciascun sistema distribuito.
Ad esempio, supponiamo che l'inventario di un partner sia separato in due aree geografiche (inventario Stati Uniti e UE), che risiedono in due sistemi separati.
Il partner può suddividere ogni feed in due file (o shard):
- Feed dei commercianti: 1 shard per gli Stati Uniti e 1 shard per l'UE
- Feed di servizi: 1 shard per gli Stati Uniti e 1 shard per l'UE
- Feed di disponibilità: 1 shard per gli Stati Uniti e 1 shard per l'UE
Per assicurarti che i feed vengano elaborati correttamente:
- Decidi una pianificazione di caricamento e configura ogni istanza di inventario in modo che segua 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. - A ogni orario di caricamento pianificato, definisci un
generation_timestamp
e ilnonce
. InFeedMetadata
, imposta tutte le istanze in modo che contengano gli stessi valori per questi due campi.- Il codice
generation_timestamp
deve essere aggiornato o recente (preferibilmente, il timestamp del database di lettura del partner)
- Il codice
- Dopo aver caricato tutti gli shard, Google raggruppa gli shard tramite
generation_timestamp
enonce
.
Google elaborerà il feed come se fosse anch'esso che ogni shard rappresenti una
regione diversa dell'inventario del partner e possa essere caricato in un'ora
diversa del giorno, a condizione che l'elemento generation_timestamp
sia lo stesso in tutti gli shard.
Esempio di feed di disponibilità con dati suddivisi per area geografica
Shard 0 - Inventario USA
{ "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" } ] } ] }