Segmenter les fichiers des flux

En fonction de votre inventaire, il peut être nécessaire de segmenter (ou diviser les flux en plusieurs fichiers).

Quand utiliser la segmentation ?

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

    • Exemple:Le flux de disponibilité généré mesure 1 Go. Il doit être divisé en plus de cinq fichiers (ou segments) distincts.
  • L'inventaire des partenaires est réparti entre les systèmes et/ou les régions, ce qui entraîne des difficultés pour le rapprochement.

    • Exemple : Le partenaire dispose d'inventaires aux États-Unis et dans l'UE qui résident dans des systèmes distincts. Le flux peut être généré avec deux fichiers (ou segments), un pour les États-Unis et un pour l'UE avec les mêmes attributs nonce et generation_timestamp.

Règles générales

  • Chaque partition ne peut pas dépasser 200 Mo pour 1 fichier (après compression au format gzip).
  • Nous vous recommandons de ne pas dépasser 20 segments par flux. Si votre justification commerciale nécessite un montant plus élevé, 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, il n'est pas nécessaire qu'elles soient envoyées dans le segment avec le même shard_number pour les futurs flux.
  • Pour de meilleures performances, vos données doivent être réparties équitablement entre les partitions afin que la taille de tous les fichiers segmentés soit similaire.

Segmenter des flux

Pour chaque fichier (ou segment), définissez FeedMetadata sur ce qui suit:

  • processing_instruction défini sur PROCESS_AS_COMPLETE.
  • shard_number défini sur la partition actuelle du flux (de 0 à total_shards - 1 sans discontinuité)
  • total_shards défini sur le nombre total de segments pour le flux (à partir de 1).
  • nonce défini sur un identifiant unique identique dans toutes les partitions d'un même flux, mais différent de la valeur d'autres flux.
  • generation_timestamp est l'horodatage au format unix et EPOCH. Il doit être identique à tous les segments du flux.

Recommandé:pour chaque fichier (ou segment), définissez le nom de fichier pour indiquer le type de flux, l'horodatage, le numéro de segment et le nombre total de segments. La taille des segments doit être à peu près égale. Ils sont traités une fois tous les segments importés.

  • Example: “availability_feed_1574117613_001_of_002.json.gz”

Exemple de flux de disponibilité segmenté

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é du partenaire

Il peut être difficile pour les partenaires de regrouper l'inventaire réparti sur plusieurs systèmes et régions dans un seul flux. La segmentation peut permettre de résoudre les problèmes de rapprochement en définissant chaque segment de sorte qu'il corresponde à l'ensemble d'inventaire de chaque système distribué.

Par exemple, supposons que l'inventaire d'un partenaire soit divisé en deux régions (inventaires américain et européen), qui résident dans deux systèmes distincts.

Le partenaire peut diviser chaque flux en deux (ou segments) distincts :

  • Flux marchands: 1 segment pour les États-Unis, 1 segment pour l'UE
  • Flux de services: un segment pour les États-Unis, un segment pour l'UE
  • Flux de disponibilité: 1 segment pour les États-Unis, 1 segment pour l'UE

Pour vous assurer que les flux sont correctement traités, procédez comme suit:

  1. Définissez un calendrier d'importation, puis configurez chaque instance d'inventaire de manière à respecter le calendrier.
  2. Attribuez un numéro de partition unique à chaque instance (par exemple, US = N, EU = N + 1). Définissez total_shards sur le nombre total de segments.
  3. Pour chaque importation planifiée, définissez un generation_timestamp et un nonce. Dans FeedMetadata, définissez toutes les instances de sorte 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 toutes les partitions importées, Google les regroupe via generation_timestamp et nonce.

Google traite le flux comme s'il s'agissait d'un segment distinct qui représente une région différente de l'inventaire du partenaire et qui peut être importé à une heure différente de la journée, à condition que les valeurs generation_timestamp soient identiques dans tous les segments.

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

Segment 0 – Inventaire américain

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

Segment 1 – Inventaire dans 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"
        }
      ]
    }
  ]
}