Segmenter les fichiers de flux

Selon votre inventaire, le fractionnement (ou la division des flux en plusieurs fichiers) peut être nécessaire.

Quand utiliser le sharding

  • Le flux dépasse 200 Mo pour un fichier (après compression gzip).

    • Exemple:Le flux de disponibilité généré est de 1 Go. Il doit être divisé en cinq fichiers (ou fragments) ou plus.
  • L'inventaire des partenaires est réparti entre des systèmes et/ou des régions, ce qui rend la réconciliation de l'inventaire difficile.

    • Exemple:Le partenaire dispose d'un inventaire aux États-Unis et dans l'Union européenne qui se trouve dans des systèmes distincts. Le flux peut être généré avec deux fichiers (ou fragments), un pour les États-Unis et un pour l'Union européenne, avec les mêmes nonce et generation_timestamp.

Règles générales

  • Chaque segment ne peut pas dépasser 200 Mo pour un fichier (après compression gzip).
  • Nous vous recommandons de ne pas utiliser plus de 20 segments par flux. Si vous avez une justification commerciale qui nécessite un montant supérieur, veuillez contacter l'assistance pour obtenir des instructions.
  • Les enregistrements individuels (un objet Merchant, par exemple) doivent être envoyés dans un segment. Ils ne peuvent pas être répartis sur plusieurs segments. Toutefois, ils n'ont pas besoin d'être envoyés dans le segment avec le même shard_number pour les futurs flux.
  • Pour de meilleures performances, répartissez les données de manière égale entre les segments, afin que la taille de tous les fichiers segmentés soit la même.

Segmenter des flux

Pour chaque fichier (ou fragment), définissez FeedMetadata sur les valeurs suivantes:

  • processing_instruction défini sur PROCESS_AS_COMPLETE.
  • shard_number défini sur le segment actuel du flux (à partir de 0 jusqu'à total_shards - 1 sans discontinuités)
  • total_shards défini sur le nombre total de segments pour le flux (à partir de 1).
  • nonce défini sur un identifiant unique qui est identique pour tous les segments du même flux, mais différent de la valeur des autres flux. nonce doit être un entier positif (uint64).
  • generation_timestamp est l'horodatage au format Unix et EPOCH. Cette valeur doit être identique pour tous les segments du flux.

Recommandation:Pour chaque fichier (ou segment), définissez le nom de fichier pour indiquer le type de flux, le code temporel, le numéro de segment et le nombre total de segments. Les segments doivent être à peu près de la même taille et sont traités une fois tous les segments importés.

  • Example: “availability_feed_1574117613_001_of_002.json.gz”

Exemple de flux de disponibilité fractionné

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

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

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

Utiliser la segmentation pour l'inventaire distribué par les partenaires

Il peut être difficile pour les partenaires de consolider l'inventaire distribué sur plusieurs systèmes et/ou régions dans un seul flux. Le fractionnement peut être utilisé pour résoudre les problèmes de réconciliation en définissant chaque fragment pour qu'il corresponde à l'ensemble d'inventaire de chaque système distribué.

Par exemple, imaginons que l'inventaire d'un partenaire soit divisé en deux régions (inventaire des États-Unis et de l'UE), qui se trouvent dans deux systèmes distincts.

Le partenaire peut diviser chaque flux en deux fichiers (ou fragments):

  • Flux marchands: 1 segment pour les États-Unis, 1 segment pour l'UE
  • Flux services: 1 segment pour les États-Unis, 1 segment pour l'UE
  • Flux disponibilité: 1 segment pour les États-Unis, 1 segment pour l'Union européenne

Suivez les étapes ci-dessous pour vous assurer que les flux sont correctement traités:

  1. Définissez un calendrier d'importation et configurez chaque instance d'inventaire pour qu'elle suive ce calendrier.
  2. Attribuez des numéros de segment uniques à chaque instance (par exemple, États-Unis = N, Europe = N + 1). Définissez total_shards sur le nombre total de segments.
  3. À chaque heure d'importation planifiée, choisissez un generation_timestamp et un nonce. Dans FeedMetadata, définissez toutes les instances pour qu'elles contiennent les mêmes valeurs pour ces deux champs.
    • generation_timestamp doit être actuel ou récent (idéalement, l'horodatage de la base de données de lecture du partenaire)
  4. Une fois tous les fragments importés, Google les regroupe via generation_timestamp et nonce.

Google traitera le flux comme un seul flux, même si chaque segment représente une région différente de l'inventaire du partenaire et qu'il peut être importé à une heure différente de la journée, à condition que le generation_timestamp soit le même pour tous les segments.

Exemple de flux de disponibilité segmenté par région

Fragment 0 : inventaire aux États-Unis

{
  "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 - Inventaire de l'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"
        }
      ]
    }
  ]
}