Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
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 della disponibilità generato è di 1 GB. Deve essere suddiviso in almeno 5 file (o frammenti) 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 e generation_timestamp.
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 singolo shard e non possono essere suddivisi in più shard. Tuttavia, non devono essere inviati nel frammento con lo stesso shard_number per i feed futuri.
Per migliorare le prestazioni, i dati devono essere suddivisi in modo uniforme tra i frammenti in modo che tutti i file suddivisi in frammenti abbiano dimensioni simili.
Come suddividere i feed
Per ogni file (o frammento), imposta FeedMetadata su quanto segue:
processing_instruction impostato su
PROCESS_AS_COMPLETE.
shard_number impostato sul frammento corrente del feed
(da 0 a total_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.
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 due 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:
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 programmata, scegli un valore per generation_timestamp e nonce. In FeedMetadata, 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 e nonce.
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
[null,null,["Ultimo aggiornamento 2025-07-26 UTC."],[[["\u003cp\u003eSharding, or splitting feeds into multiple files, is recommended when a single feed file exceeds 200 MB after gzip compression or when inventory is distributed across different systems.\u003c/p\u003e\n"],["\u003cp\u003eEach shard should be under 200 MB after gzip compression, with a recommended maximum of 20 shards per feed.\u003c/p\u003e\n"],["\u003cp\u003eAll shards for a single feed must use the same \u003ccode\u003enonce\u003c/code\u003e and \u003ccode\u003egeneration_timestamp\u003c/code\u003e in their metadata for proper processing.\u003c/p\u003e\n"],["\u003cp\u003eWhen sharding, individual records must be kept within a single shard and cannot be split across multiple shards.\u003c/p\u003e\n"],["\u003cp\u003eFor distributed inventory, sharding can be used to represent different regions or systems by assigning unique shard numbers while maintaining consistent \u003ccode\u003enonce\u003c/code\u003e and \u003ccode\u003egeneration_timestamp\u003c/code\u003e.\u003c/p\u003e\n"]]],["Sharding divides large or geographically diverse feeds into multiple files. Use it when a feed exceeds 200MB after compression or when inventory is in separate systems/regions. Each shard must be under 200MB, with no more than 20 shards per feed. Assign each shard a unique `shard_number` and a common `nonce` and `generation_timestamp`. Shards are processed after the last file is uploaded. Ensure even data distribution across shards for performance, and keep individual records within a single shard.\n"],null,["# Shard feed files\n\nDepending on your inventory, sharding (or breaking up feeds into multiple\nfiles) may be necessary.\n| **Note:** Sharding might only be applicable to some of the feeds you submit and is dependent on the type of inventory submitted. Please reach out to your Google contact if you are unsure of the best approach.\n\nWhen to use sharding\n--------------------\n\n- Feed exceeds 200 MB for 1 file (after gzip compression).\n\n - **Example:** Generated availability feed is 1 GB. This should be sharded to 5+ separate files (or shards).\n- Partner inventory is distributed across systems and/or regions\n resulting in difficulty reconciling the inventory.\n\n - **Example:** Partner has US and EU inventory that live in separate systems. The feed may be generated with 2 files (or shards), 1 for US, and 1 for EU with the same `nonce` and `generation_timestamp`.\n\n| **Note:** Before using sharding, make sure you are [compressing your feed uploads with gzip](/actions-center/verticals/local-services/e2e/reference/tutorials/compression). Using gzip can reduce feed size by 10x or more, and may allow you to skip or defer sharding your feed.\n\nGeneral rules\n-------------\n\n- Each shard cannot exceed 200 MB for 1 file (after gzip compression).\n- We recommend no more than 20 shards per feed. If you have a business justification that requires more than that amount, please contact support for further instruction.\n- Individual records (one `Merchant` object for example) must be sent in one shard, they cannot be split across multiple shards. However, they don't have to be sent in the shard with the same `shard_number` for future feeds.\n- For better performance, your data should be split evenly among the shards so that all sharded files are similar in size.\n\n| **Note:** Google processes feed files as soon as they're uploaded to the SFTP server. If the feed is sharded into multiple files, the process begins after you upload the last file. If your feed contains errors, you receive an email with the [feed error codes](/actions-center/verticals/local-services/e2e/reference/feeds/feed-errors).\n\nHow to shard feeds\n------------------\n\nFor each file (or shard), set the `FeedMetadata` to the\nfollowing:\n\n- `processing_instruction`set to `PROCESS_AS_COMPLETE`.\n- `shard_number` set to to the current shard of the feed (starting from 0 to `total_shards` - 1 without discontinuities)\n- `total_shards` set to the total number of shards for the feed (starting from 1).\n- `nonce` set to a unique identifier that is **the same** across all shards of **the same** feed but different from the value of other feeds. `nonce` must be a positive int (`uint64`).\n- `generation_timestamp` is the timestamp in unix and EPOCH format. This should be **the same** across all shards of the feed.\n\n*Recommended:* For each file (or shard), set the filename to indicate\nthe feed type, the timestamp, the shard number, and the total number of\nshards. Shards should be roughly equal in size and are processed once all\nshards are uploaded.\n\n- `Example:` \"availability_feed_1574117613_001_of_002.json.gz\"\n\n**Sharded Availability feed example** \n\n### Shard 0\n\n```scdoc\n{\n \"metadata\": {\n \"processing_instruction\": \"PROCESS_AS_COMPLETE\",\n \"shard_number\": 0,\n \"total_shards\": 3,\n \"nonce\": 111111,\n \"generation_timestamp\": 1524606581\n },\n \"service_availability\": [\n {\n \"availability\": [\n {\n \"spots_total\": 1,\n \"spots_open\": 1,\n \"duration_sec\": 3600,\n \"service_id\": \"1000\",\n \"start_sec\": 1577275200,\n \"merchant_id\": \"merchant1\",\n \"confirmation_mode\": \"CONFIRMATION_MODE_SYNCHRONOUS\"\n }\n ]\n }\n ]\n}\n```\n\n### Shard 1\n\n```scdoc\n{\n \"metadata\": {\n \"processing_instruction\": \"PROCESS_AS_COMPLETE\",\n \"shard_number\": 1,\n \"total_shards\": 3,\n \"nonce\": 111111,\n \"generation_timestamp\": 1524606581\n },\n \"service_availability\": [\n {\n \"availability\": [\n {\n \"spots_total\": 1,\n \"spots_open\": 1,\n \"duration_sec\": 3600,\n \"service_id\": \"1000\",\n \"start_sec\": 1577620800,\n \"merchant_id\": \"merchant2\",\n \"confirmation_mode\": \"CONFIRMATION_MODE_SYNCHRONOUS\"\n }\n ]\n }\n ]\n}\n```\n\n### Shard 2\n\n```scdoc\n{\n \"metadata\": {\n \"processing_instruction\": \"PROCESS_AS_COMPLETE\",\n \"shard_number\": 2,\n \"total_shards\": 3,\n \"nonce\": 111111,\n \"generation_timestamp\": 1524606581\n },\n \"service_availability\": [\n {\n \"availability\": [\n {\n \"spots_total\": 1,\n \"spots_open\": 1,\n \"duration_sec\": 3600,\n \"service_id\": \"1000\",\n \"start_sec\": 1576670400,\n \"merchant_id\": \"merchant3\",\n \"confirmation_mode\": \"CONFIRMATION_MODE_SYNCHRONOUS\"\n }\n ]\n }\n ]\n}\n```\n\nUsing sharding for partner distributed inventory\n------------------------------------------------\n\nIt can be challenging for partners to consolidate inventory distributed\nacross multiple systems and or regions into a single feed. Sharding can be\nused to resolve reconciliation challenges by setting each shard to match each\ndistributed system's inventory set.\n\nFor example, say a partner's inventory is separated into 2 regions (US and EU\ninventory), which live in 2 separate systems.\n\nThe partner can break each feed into 2 files (or shards):\n\n- Merchants feed: 1 shard for US, 1 shard for EU\n- Services feed: 1 shard for US, 1 shard for EU\n- Availability feed: 1 shard for US, 1 shard for EU\n\nFollow the steps below to ensure the feeds are properly processed:\n\n1. Decide on an upload schedule, and configure each instance of inventory to follow the schedule.\n2. Assign unique shard numbers for each instance (e.g. US = N, EU = N + 1). Set `total_shards` to the total number of shards.\n3. At each scheduled upload time, decide on a `generation_timestamp` and `nonce`. In the `FeedMetadata`, set all instances to hold the same values for these two fields.\n - `generation_timestamp` should be current or recent past (ideally, the partner's read-at database timestamp)\n4. After all shards are uploaded, Google groups the shards via `generation_timestamp` and `nonce`.\n\n| **Note:** Feeds/shards arriving separately at different times is supported, but coordinated schedules is best. Feed processing occurs only when all shards in a feed set are uploaded.\n\nGoogle will process the feed as one even though each shard represents a\ndifferent region of the partner's inventory and could be uploaded at a\ndifferent time of the day as long as the `generation_timestamp`\nis the same across all shards.\n\n**Sharded Availability feed example by region** \n\n### Shard 0 - US Inventory\n\n```scdoc\n{\n \"metadata\": {\n \"processing_instruction\": \"PROCESS_AS_COMPLETE\",\n \"shard_number\": 0,\n \"total_shards\": 2,\n \"nonce\": 111111,\n \"generation_timestamp\": 1524606581\n },\n \"service_availability\": [\n {\n \"availability\": [\n {\n \"spots_total\": 1,\n \"spots_open\": 1,\n \"duration_sec\": 3600,\n \"service_id\": \"1000\",\n \"start_sec\": 1577275200,\n \"merchant_id\": \"US_merchant_1\",\n \"confirmation_mode\": \"CONFIRMATION_MODE_SYNCHRONOUS\"\n }\n ]\n }\n ]\n}\n```\n\n### Shard 1 - EU Inventory\n\n```scdoc\n{\n \"metadata\": {\n \"processing_instruction\": \"PROCESS_AS_COMPLETE\",\n \"shard_number\": 1,\n \"total_shards\": 2,\n \"nonce\": 111111,\n \"generation_timestamp\": 1524606581\n },\n \"service_availability\": [\n {\n \"availability\": [\n {\n \"spots_total\": 1,\n \"spots_open\": 1,\n \"duration_sec\": 3600,\n \"service_id\": \"1000\",\n \"start_sec\": 1577620800,\n \"merchant_id\": \"EU_merchant_1\",\n \"confirmation_mode\": \"CONFIRMATION_MODE_SYNCHRONOUS\"\n }\n ]\n }\n ]\n}\n```"]]