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 sulla disponibilità generato è di 1 GB. Questo file deve essere suddiviso in almeno 5 file separati (o shard).
L'inventario dei partner è distribuito in sistemi e/o regioni con conseguente difficoltà di riconciliazione dell'inventario.
- Esempio: il partner dispone di un inventario negli Stati Uniti e nell'UE che si trova in sistemi separati. Il feed può essere generato con due file (o shard), uno per gli Stati Uniti e uno per l'UE, con lo stesso
noncee lo stessogeneration_timestamp.
- Esempio: il partner dispone di un inventario negli Stati Uniti e nell'UE che si trova in sistemi separati. Il feed può essere generato con due file (o shard), uno per gli Stati Uniti e uno per l'UE, con lo stesso
Regole generali
- Ogni shard non può superare i 200 MB per un file (dopo la compressione gzip).
- Ti consigliamo di non superare i 20 shard per feed. Se hai una giustificazione aziendale che richiede un importo superiore, 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 in più shard. Tuttavia, non devono essere inviati nello shard con lo stessoshard_numberper 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 shard), imposta FeedMetadata su
quanto segue:
processing_instructionimpostato suPROCESS_AS_COMPLETE.shard_numberimpostato sul segmento corrente del feed (a partire da 0 fino atotal_shards- 1 senza discontinuità)total_shardsimpostato sul numero totale di shard per il feed (a partire da 1).nonceimpostato su un identificatore univoco che sia lo stesso in tutti gli shard dello stesso feed, ma diverso dal valore di altri feed.generation_timestampè il timestamp in formato Unix ed EPOCH. Questo valore deve essere lo stesso in tutti gli shard del feed.
Consigliato:per ogni file (o shard), imposta il nome del file in modo che indichi il tipo di feed, il timestamp, il numero di shard e il numero totale di shard. Le partizioni devono avere dimensioni più o meno uguali e vengono elaborate una volta caricate tutte le partizioni.
Example:“availability_feed_1574117613_001_of_002.json.gz”
Esempio di feed Disponibilità suddiviso
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
Per i partner può essere difficile consolidare l'inventario distribuito in 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 a ogni insieme di inventario del sistema distribuito.
Ad esempio, supponiamo che l'inventario di un partner sia suddiviso in due regioni (inventario USA e UE), che si trovano in due sistemi separati.
Il partner può dividere ogni feed in due 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, segui questi passaggi:
- Decidi una pianificazione di caricamento e configura ogni istanza dell'inventario in modo che segua la pianificazione.
- Assegna numeri di shard univoci per ogni istanza (ad es. Stati Uniti = N, Europa = N + 1).
Imposta
total_shardssul numero totale di shard. - A ogni ora di caricamento programmata, decidi un
generation_timestampe unnonce. InFeedMetadata, imposta tutte le istanze in modo che contengano gli stessi valori per questi due campi.generation_timestampdeve essere la data corrente o una data recente del passato (idealmente, il timestamp del database di lettura del partner)
- Una volta caricati tutti gli shard, Google li raggruppa tramite
generation_timestampenonce.
Google elaborerà il feed come un unico feed anche se ogni shard rappresenta una
regione diversa dell'inventario del partner e potrebbe essere caricato in un
momento diverso della giornata, purché il generation_timestamp
sia lo stesso in tutti gli shard.
Esempio di feed Disponibilità suddiviso per regione
Shard 0 - US Inventory
{
"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"
}
]
}
]
}