File di feed con 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 disponibilità generato è di 1 GB. Deve essere partizionato con più di 5 file (o shard) separati.
  • L'inventario dei partner è distribuito tra sistemi e/o regioni, il che complica la riconciliazione dell'inventario.

    • Esempio: il partner ha un inventario per gli Stati Uniti e l'UE che risiedono in sistemi separati. Il feed può essere generato con 2 file (o shard), uno per gli Stati Uniti e uno per l'UE con gli stessi nonce e generation_timestamp.

Regole generali

  • Ogni shard non può superare i 200 MB per un file (dopo la compressione con gzip).
  • Consigliamo di non inserire più di 20 shard per feed. Se hai una giustificazione aziendale che richiede un importo maggiore di questo importo, 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 tra più shard. Tuttavia, non devono essere inviati nello shard con lo stesso shard_number per i feed futuri.
  • Per ottenere prestazioni migliori, i dati dovrebbero essere suddivisi in modo uniforme tra gli shard in modo che tutti i file con shard siano simili di dimensioni.

Come eseguire lo sharding dei feed

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

  • processing_instructionimpostato su PROCESS_AS_COMPLETE.
  • shard_number impostato sullo shard attuale del feed (a partire 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 per tutti gli shard stesso feed, ma diverso dal valore di altri feed.
  • generation_timestamp è il timestamp in formato unix ed EPOCH. Deve essere uguale su tutti gli shard del feed.

Consigliato: per ogni file (o shard), imposta il nome file per indicare il tipo di feed, il timestamp, il numero di shard e il numero totale di shard. Gli shard devono avere dimensioni approssimativamente uguali e vengono elaborati una volta caricati tutti gli 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 tra più sistemi e/o regioni in un unico feed. Il partizionamento orizzontale può essere utilizzato per risolvere le sfide di riconciliazione impostando ogni shard in modo che corrisponda al set di inventario di ciascun sistema distribuito.

Ad esempio, supponiamo che l'inventario di un partner sia suddiviso in 2 regioni (inventario degli Stati Uniti e dell'UE), che risiedono in 2 sistemi distinti.

Il partner può suddividere ciascun feed in 2 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:

  1. Decidi un programma di caricamento 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. A ogni data di caricamento pianificata, scegli 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 attuale o recente nel passato (preferibilmente, il timestamp del database di lettura del partner)
  4. Dopo aver caricato tutti gli shard, Google li raggruppa tramite generation_timestamp e nonce.

Google elaborerà il feed come uno solo, anche se ogni shard rappresenta una regione diversa dell'inventario del partner e potrebbe essere caricato a un'ora diversa del giorno, purché generation_timestamp sia lo stesso per tutti gli shard.

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