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
nonceetgeneration_timestamp.
- 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
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êmeshard_numberpour 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 surPROCESS_AS_COMPLETE.shard_numberdéfini sur le shard actuel du flux (de 0 àtotal_shards-1 sans discontinuités)total_shardsdéfini sur le nombre total de segments pour le flux (à partir de 1).noncedé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_timestampcorrespond 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 :
- Définissez un calendrier d'importation et configurez chaque instance d'inventaire pour qu'elle le respecte.
- Attribuez des numéros de partition uniques à chaque instance (par exemple, États-Unis = N, Europe = N+1).
Définissez
total_shardssur le nombre total de segments. - À chaque heure d'importation planifiée, choisissez un
generation_timestampet unnonce. DansFeedMetadata, définissez toutes les instances pour qu'elles contiennent les mêmes valeurs pour ces deux champs.generation_timestampdoit être la date actuelle ou une date récente (idéalement, l'horodatage de la base de données de lecture du partenaire).
- Une fois tous les fragments importés, Google les regroupe via
generation_timestampetnonce.
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"
}
]
}
]
}