A seconda dell'inventario, potrebbe essere necessario lo sharding (o la suddivisione dei feed in più file).
Quando utilizzare lo sharding
Il feed supera i 200 MB per un file (dopo la compressione gzip).
- Esempio:il feed disponibilità generato è di 1 GB. Deve essere partizionato con più di 5 file (o shard) separati.
L'inventario dei partner è distribuito tra sistemi e/o regioni, il che complica la riconciliazione dell'inventario.
- Esempio: il partner ha un inventario per gli Stati Uniti e l'UE che risiedono in sistemi separati. Il feed può essere generato con 2 file (o shard), uno per gli Stati Uniti
e uno per l'UE con gli stessi
nonce
egeneration_timestamp
.
- Esempio: il partner ha un inventario per gli Stati Uniti e l'UE che risiedono in sistemi separati. Il feed può essere generato con 2 file (o shard), uno per gli Stati Uniti
e uno per l'UE con gli stessi
Regole generali
- Ogni shard non può superare i 200 MB per un file (dopo la compressione con gzip).
- Consigliamo di non inserire più di 20 shard per feed. Se hai una giustificazione aziendale che richiede un importo maggiore di questo importo, contatta l'assistenza per ulteriori istruzioni.
-
I singoli record (ad esempio un oggetto
Merchant
) devono essere inviati in uno shard e non possono essere suddivisi tra più shard. Tuttavia, non devono essere inviati nello shard con lo stessoshard_number
per i feed futuri. - Per ottenere prestazioni migliori, i dati dovrebbero essere suddivisi in modo uniforme tra gli shard in modo che tutti i file con shard siano simili di dimensioni.
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 attuale del feed (a partire 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 per tutti gli shard stesso feed, ma diverso dal valore di altri feed.generation_timestamp
è il timestamp in formato unix ed EPOCH. Deve essere uguale su tutti gli shard del feed.
Consigliato: per ogni file (o shard), imposta il nome file per indicare il tipo di feed, il timestamp, il numero di shard e il numero totale di shard. Gli shard devono avere dimensioni approssimativamente uguali e vengono elaborati una volta caricati tutti gli shard.
Example:
“availability_feed_1574117613_001_of_002.json.gz”
Esempio di feed di disponibilità con 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" } ] } ] }
Utilizzare lo sharding per l'inventario distribuito dai partner
Può essere difficile per i partner consolidare l'inventario distribuito tra più sistemi e/o regioni in un unico feed. Il partizionamento orizzontale può essere utilizzato per risolvere le sfide di riconciliazione impostando ogni shard in modo che corrisponda al set di inventario di ciascun sistema distribuito.
Ad esempio, supponiamo che l'inventario di un partner sia suddiviso in 2 regioni (inventario degli Stati Uniti e dell'UE), che risiedono in 2 sistemi distinti.
Il partner può suddividere ciascun feed in 2 file (o shard):
- Feed dei commercianti: 1 shard per gli Stati Uniti, 1 shard per l'UE
- Feed dei 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:
- Decidi un programma di caricamento 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. - A ogni data di caricamento pianificata, scegli un
generation_timestamp
e unnonce
. InFeedMetadata
, imposta tutte le istanze in modo che contengano gli stessi valori per questi due campi.generation_timestamp
deve essere attuale o recente nel passato (preferibilmente, il timestamp del database di lettura del partner)
- Dopo aver caricato tutti gli shard, Google li raggruppa tramite
generation_timestamp
enonce
.
Google elaborerà il feed come uno solo, anche se ogni shard rappresenta una regione diversa dell'inventario del partner e potrebbe essere caricato a un'ora diversa del giorno, purché generation_timestamp
sia lo stesso per tutti gli shard.
Esempio di feed di disponibilità con sharding in base alla 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" } ] } ] }