Aller au contenu

Choisir entre globalId et contentId

AvroSerializer intègre un identifiant de schema sur 4 octets dans chaque message sérialisé. Vous pouvez choisir quel identifiant utiliser grâce au paramètre use_id. Ce guide explique les compromis.

Les deux identifiants

Chaque version de schema dans Apicurio Registry possède deux identifiants :

Identifiant Ce que c'est Comment il est attribué
globalId Un entier unique, auto-incrémenté, attribué lors de la création d'une version d'artefact. Séquentiel — 1, 2, 3, ... à travers l'ensemble du registry.
contentId Un entier dérivé du contenu, calculé à partir des octets du schema. Déterministe — deux schemas identiques partagent toujours le même contentId.

Les deux sont renvoyés par le registry dans les en-têtes de réponse HTTP (X-Registry-GlobalId et X-Registry-ContentId) et mis en cache par ApicurioRegistryClient.

Comment choisir

# Default: use globalId
serializer = AvroSerializer(
    registry_client=client,
    artifact_id="UserEvent",
    use_id="globalId",
)

# Alternative: use contentId
serializer = AvroSerializer(
    registry_client=client,
    artifact_id="UserEvent",
    use_id="contentId",
)

Quand utiliser globalId (par défaut)

Utilisez globalId lorsque :

  • Vous souhaitez le comportement par défaut — il correspond à la convention wire format Confluent la plus courante
  • Vos consommateurs résolvent les schemas par historique de version (la plupart des configurations Apicurio et Confluent)
  • Chaque version de schema doit avoir un identifiant distinct, même si le contenu du schema est identique à une version précédente

globalId est le choix par défaut recommandé. Choisissez-le sauf si vous avez une raison spécifique d'utiliser contentId.

Quand utiliser contentId

Utilisez contentId lorsque :

  • Vos consommateurs sont configurés pour résoudre les schemas par hash de contenu plutôt que par identifiant de version
  • Vous voulez que des schemas identiques enregistrés dans des groupes différents ou en tant qu'artefacts différents partagent le même identifiant dans le wire format
  • Vous utilisez les fonctionnalités de déduplication par contenu d'Apicurio

Producteur et consommateur doivent s'accorder

Le type d'identifiant n'est pas encodé dans le wire format. globalId et contentId occupent tous deux les mêmes 4 octets dans l'en-tête du message. Le consommateur doit savoir quel type attendre.

Si le producteur intègre un contentId mais que le consommateur l'interprète comme un globalId (ou inversement), le consommateur récupérera le mauvais schema ou ne parviendra pas à en trouver un.

Assurez-vous que les configurations de votre producteur et de votre consommateur s'accordent sur le type d'identifiant utilisé.

Comportement du registry

Lorsque ApicurioRegistryClient récupère un schema, le registry renvoie les deux identifiants dans les en-têtes de réponse. Le client met les deux en cache. Le paramètre use_id contrôle uniquement lequel est écrit dans l'en-tête du wire format par le serializer — il n'affecte ni ce que le registry renvoie, ni le fonctionnement de la mise en cache.