Suddivisione dei file del feed

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 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 unico 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 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 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.

  • 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:

  1. Scegli una pianificazione dei caricamenti e configura ogni istanza dell'inventario in modo che rispetti la pianificazione.
  2. Assegna numeri di shard univoci per ogni istanza (ad es. US = N, EU = N + 1). Imposta total_shards sul numero totale di shard.
  3. Per ogni ora di caricamento pianificata, 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)
  4. 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

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"
        }
      ]
    }
  ]
}