Sharding dei file del feed

A seconda del tuo inventario, lo sharding (o la suddivisione dei feed in più file) potrebbero essere necessari.

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. Dovrebbe essere con sharding in più di 5 file separati (o shard).
  • L'inventario dei partner è distribuito tra sistemi e/o regioni causando difficoltà nella riconciliazione dell'inventario.

    • Esempio: il partner ha un inventario per gli Stati Uniti e l'UE che risiedono in servizi sistemi diversi. Il feed può essere generato con 2 file (o shard), uno per gli Stati Uniti e 1 per UE con lo stesso nonce e generation_timestamp.
di Gemini Advanced.

Regole generali

  • Ciascun shard non può superare i 200 MB per 1 file (dopo la compressione gzip).
  • 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, non possono essere suddivisi in più shard. Tuttavia, non devono essere inviati nello shard con lo stesso shard_number per i feed futuri.
  • Per ottenere prestazioni migliori, i dati devono essere suddivisi equamente tra in modo che tutti i file con sharding abbiano dimensioni simili.
di Gemini Advanced.

Come eseguire lo sharding dei feed

Per ogni file (o shard), imposta FeedMetadata su seguenti:

  • processing_instructionimpostato su PROCESS_AS_COMPLETE.
  • shard_number impostato sullo shard corrente del feed (a partire da 0 a total_shards - 1 senza discontinuità)
  • total_shards impostato sul numero totale di shard per 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 unix ed EPOCH formato. Dovrebbe essere uguale per tutti gli shard del feed.

Consigliato: per ogni file (o shard), imposta il nome file in modo da indicare il tipo di feed, il timestamp, il numero di shard e il numero totale o shard. Gli shard dovrebbero avere più o meno le stesse dimensioni e vengono elaborati una volta vengono caricati 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 in più sistemi e/o regioni in un unico feed. Lo sharding può essere utilizzate per risolvere le sfide della riconciliazione impostando ogni shard in modo che l'inventario di un sistema distribuito.

Ad esempio, supponiamo che l'inventario di un partner sia separato in due regioni (Stati Uniti e UE dell'inventario), che risiedono 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:

  1. Decidi una pianificazione dei caricamenti e configura ogni istanza dell'inventario per seguite il programma.
  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, generation_timestamp e nonce. Nella FeedMetadata, imposta tutte le istanze in modo che conservino gli stessi valori per questi due campi.
    • generation_timestamp deve essere attuale o recente (possibilmente, il timestamp del database di lettura del partner)
  4. Dopo aver caricato tutti gli shard, Google li raggruppa tramite generation_timestamp e nonce.
di Gemini Advanced.

Google elaborerà il feed come un feed unico anche se ogni shard rappresenta un regione diversa dell'inventario del partner e potrebbero essere caricati a un a un'ora del giorno diversa purché l'generation_timestamp è lo stesso per tutti gli shard.

Esempio di feed di disponibilità con sharding 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"
        }
      ]
    }
  ]
}