Sharding dei file dei feed

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 e generation_timestamp.

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 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 con sharding abbiano dimensioni simili.

Come eseguire lo sharding dei feed

Per ogni file (o shard) imposta FeedMetadata come segue:

  • processing_instruction impostato su PROCESS_AS_COMPLETE.
  • shard_number impostato sullo shard corrente del feed (a partire da 0 con 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 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:

  1. Decidi una pianificazione di caricamento e configura ogni istanza di inventario in modo che segua 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. A ogni orario di caricamento pianificato, definisci un generation_timestamp e il nonce. In FeedMetadata, 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)
  4. Dopo aver caricato tutti gli shard, Google raggruppa gli shard tramite generation_timestamp e nonce.

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