Fichiers de flux segmentés (anciens)

Selon votre inventaire, il peut être nécessaire de fragmenter vos flux (c'est-à-dire de les diviser en plusieurs fichiers).

Quand utiliser le sharding

  • La taille du 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 fragmenté en au moins cinq fichiers distincts (ou fragments).
  • L'inventaire des partenaires est réparti entre les systèmes et/ou les régions, ce qui rend difficile la réconciliation de l'inventaire.

    • Exemple : Un partenaire dispose d'un inventaire aux États-Unis et dans l'UE, 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'UE, 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 supplémentaires.
  • Les enregistrements individuels (un objet Merchant, par exemple) doivent être envoyés dans un seul 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 vos données de manière égale entre les segments, afin que la taille de tous les fichiers segmentés soit la même.

Segmenter les flux

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

  • processing_instructiondéfini sur PROCESS_AS_COMPLETE.
  • shard_number défini sur le shard actuel du flux (de 0 à 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 identique pour tous les fragments d'un même flux, mais différent de la valeur des autres flux.
  • generation_timestamp correspond au code temporel 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 de manière à indiquer le type de flux, le code temporel, le numéro de segment et le nombre total de segments. Les fragments doivent être de taille à peu près égale et sont traités une fois que tous les fragments sont importés.

  • Example: “availability_feed_1574117613_001_of_002.json.gz”

Exemple de flux de disponibilité fragmenté

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é des partenaires

Il peut être difficile pour les partenaires de regrouper dans un seul flux l'inventaire distribué dans plusieurs systèmes et/ou régions. Le sharding peut être utilisé pour résoudre les problèmes de rapprochement en définissant chaque shard de manière à ce qu'il corresponde à l'ensemble d'inventaire de chaque système distribué.

Par exemple, supposons que l'inventaire d'un partenaire soit réparti dans deux régions (inventaire aux États-Unis et dans 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 de services : 1 segment pour les États-Unis, 1 segment pour l'UE
  • Flux disponibilité : 1 segment pour les États-Unis, 1 segment pour l'UE

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 le respecte.
  2. Attribuez des numéros de partition 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 la date actuelle ou une date récente (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, même si chaque fragment représente une région différente de l'inventaire du partenaire et peut être importé à un moment différent de la journée, à condition que generation_timestamp soit le même pour tous les fragments.

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

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

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