File del feed shard (legacy)

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 nonce e lo stesso generation_timestamp.

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 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 shard), imposta FeedMetadata su quanto segue:

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

  1. Decidi una pianificazione di caricamento e configura ogni istanza dell'inventario in modo che segua la pianificazione.
  2. Assegna numeri di shard univoci per ogni istanza (ad es. Stati Uniti = N, Europa = N + 1). Imposta total_shards sul numero totale di shard.
  3. A ogni ora di caricamento programmata, decidi un generation_timestamp e un nonce. In FeedMetadata, imposta tutte le istanze in modo che contengano gli stessi valori per questi due campi.
    • generation_timestamp deve essere la data corrente o una data recente del passato (idealmente, il timestamp del database di lettura del partner)
  4. Una volta caricati tutti gli shard, Google li raggruppa tramite generation_timestamp e nonce.

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