Lors de la création de votre système Pub/Sub, la désencapsulation de la charge utile peut vous aider à vous connecter à d'autres systèmes qui ne respectent pas toutes les exigences système d'une implémentation standard de point de terminaison push Pub/Sub.
Voici quelques cas d'utilisation potentiels de la désencapsulation de la charge utile:
- Vous ne souhaitez pas écrire de code d'analyse de messages spécifique à Pub/Sub pour vos points de terminaison HTTP push.
- Vous préférez recevoir les métadonnées des messages Pub/Sub sous forme d'en-têtes HTTP au lieu de celles qui se trouvent dans le corps HTTP POST.
- Vous souhaitez envoyer des messages Pub/Sub et exclure les métadonnées Pub/Sub, par exemple lors de l'envoi de données à une API tierce.
Fonctionnement de la désencapsulation de la charge utile
La désencapsulation de la charge utile est une fonctionnalité qui supprime toutes les métadonnées des messages, à l'exception de leurs données, dans Pub/Sub. En envoyant des données de message brutes, les abonnés peuvent traiter le message sans avoir à respecter la configuration système requise de Pub/Sub.
- Avec la désencapsulation de la charge utile, les données du message sont transmises directement sous forme de corps HTTP.
- Sans désencapsulation de la charge utile, Pub/Sub diffuse un objet JSON contenant plusieurs champs de métadonnées de message et un champ de données de message. Dans ce cas, le fichier JSON doit être analysé pour récupérer les données du message, puis décodé en base64.
Écrire des métadonnées
Après avoir activé la désencapsulation de la charge utile, vous pouvez utiliser l'option writemetadata, qui ajoute les métadonnées de message précédemment supprimées dans l'en-tête de requête.
- Métadonnées en écriture activées. Ajoutez les métadonnées du message dans l'en-tête de la requête. Fournit également les données de message brutes et décodées.
- Métadonnées d'écriture désactivées. Cela permet de n'envoyer que les données de message brutes décodées.
Les métadonnées d'écriture sont exposées via Pub/Sub, l'argument Google Cloud CLI --push-no-wrapper-write-metadata
et la propriété d'API NoWrapper
.
Par défaut, cette valeur est nulle.
Avant de commencer
- En savoir plus sur les abonnements Pub/Sub et les abonnements push La désencapsulation de la charge utile ne peut être utilisée qu'avec des abonnements push.
- Découvrez comment configurer un abonnement push.
Exemple de messages encapsulés et non encapsulés
Les exemples suivants illustrent la différence entre l'envoi d'un message HTTP encapsulé et d'un message HTTP désencapsulé. Dans ces exemples, les données du message contiennent la chaîne {"status": "Hello there"}
.
Pour cet exemple, un abonnement est créé avec la fonctionnalité de désencapsulation de la charge utile activée et publie un message dans mytopic
. Elle utilise une clé de tri avec la valeur some-key
, et le type de média est déclaré comme application/json
.
gcloud pubsub topics publish mytopic --message='{"status": "Hello there"}' --ordering-key="some-key" --attribute "Content-Type=application/json"
Les sections suivantes montrent la différence entre un message encapsulé et un message désencapsulé.
Message encapsulé
L'exemple suivant présente un message encapsulé via Pub/Sub standard. Dans ce cas, la désencapsulation de la charge utile n'est pas activée.
Publier | Le point de terminaison push reçoit |
---|---|
data="{"status": "Hello there"}" ordering_key="some-key" attributes= { {"Content-Type", "application/json"} } |
Content-Length: 361 Content-Type: application/json User-Agent: CloudPubSub-Google Host: subscription-project.uc.r.appspot.com { "message": { "attributes": { "Content-Type": "application/json" }, "data": "eyJzdGF0dXMiOiAiSGVsbG8gdGhlcmUifQ==", // Base64 - {"status": "Hello there"} "messageId": "2070443601311540", "message_id": "2070443601311540", "publishTime": "2021-02-26T19:13:55.749Z", "publish_time": "2021-02-26T19:13:55.749Z" }, "subscription": "projects/myproject/..." } |
Message désencapsulé avec métadonnées d'écriture désactivées
L'exemple suivant montre un message désencapsulé avec l'option d'écriture des métadonnées désactivée. Dans ce cas, les en-têtes x-goog-pubsub-*
et les attributs de message ne sont pas inclus.
Publier | Le point de terminaison push reçoit |
---|---|
data="{"status": "Hello there"}" ordering_key="some-key" attributes= { {"Content-Type", "application/json"} } |
Content-Length: 25 User-Agent: CloudPubSub-Google Host: subscription-project.uc.r.appspot.com {"status": "Hello there"} |
Message désencapsulé avec métadonnées d'écriture activées
L'exemple suivant montre un message désencapsulé avec l'option d'écriture des métadonnées activée. Dans ce cas, les en-têtes x-goog-pubsub-*
et les attributs de message sont inclus.
Publier | Le point de terminaison push reçoit |
---|---|
data="{"status": "Hello there"}" ordering_key="some-key" attributes= { {"Content-Type", "application/json"} } |
x-goog-pubsub-subscription-name: "projects/myproject/..." x-goog-pubsub-message-id: "2070443601311540" x-goog-pubsub-publish-time: "2021-02-26T19:13:55.749Z" x-goog-pubsub-ordering-key: "some-key" Content-Type: application/json Content-Length: 12 User-Agent: CloudPubSub-Google Host: subscription-project.uc.r.appspot.com {"status": "Hello there"} |
Configurer la désencapsulation de la charge utile
Vous pouvez activer la désencapsulation de la charge utile pour la distribution push d'un abonnement à l'aide de la page Détails de l'abonnement de la console Google Cloud, de la Google Cloud CLI ou des bibliothèques clientes.
Console
Dans la console Google Cloud, accédez à la page Abonnements.
Cliquez sur Créer un abonnement.
Dans le champ ID d'abonnement, saisissez un nom.
Pour plus d'informations sur l'attribution d'un nom à un abonnement, consultez Consignes pour nommer un sujet ou un abonnement.
Sélectionnez un thème dans le menu déroulant. L'abonnement reçoit les messages du sujet.
Dans le champ Type de distribution, sélectionnez Push.
Pour activer la désencapsulation de la charge utile, sélectionnez Activer la désencapsulation de la charge utile.
(Facultatif) Pour conserver les métadonnées des messages dans l'en-tête de requête, sélectionnez Écrire les métadonnées. Vous devez activer cette option pour définir un en-tête Content-Type pour vos messages.
Spécifiez une URL de point de terminaison.
Conservez toutes les autres valeurs par défaut.
Cliquez sur Créer.
gcloud
Pour configurer un abonnement avec désencapsulation de la charge utile incluant des en-têtes HTTP standards, exécutez la commande gcloud pubsub subscriptions create
suivante:
gcloud pubsub subscriptions create SUBSCRIPTION \ --topic TOPIC \ --push-endpoint=PUSH_ENDPOINT \ --push-no-wrapper
Remplacez les éléments suivants :
SUBSCRIPTION
: nom ou ID de votre abonnement pull.TOPIC
: ID du sujet.PUSH_ENDPOINT
: URL à utiliser comme point de terminaison pour cet abonnement. Par exemple,https://myproject.appspot.com/myhandler
.--push-no-wrapper
: fournit les données du message directement dans le corps HTTP.
Pour configurer un abonnement avec désencapsulation de la charge utile et contrôler l'utilisation des en-têtes x-goog-pubsub-*
, exécutez la commande suivante:
gcloud pubsub subscriptions create SUBSCRIPTION \ --topic TOPIC \ --push-endpoint=PUSH_ENDPOINT \ --push-no-wrapper \ --push-no-wrapper-write-metadata
--push-no-wrapper-write-metadata
: lorsque la valeur est "true", écrit les métadonnées du message Pub/Sub dans les en-têtesx-goog-pubsub-<KEY>:<VAL>
de la requête HTTP. Écrit les attributs du message Pub/Sub dans les en-têtes<KEY>:<VAL>
de la requête HTTP.
Python
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Python qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Python.
Java
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Java qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Java.
C++
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage C++ qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour C++.
Go
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Go qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Go.
Node.js
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Node.js qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Node.js.
Node.js
Avant d'essayer cet exemple, suivez les instructions d'installation dans le langage Node.js qui se trouvent sur la page Démarrage rapide : utiliser des bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API Pub/Sub pour Node.js.
Définir un en-tête "content-type" dans votre message
Une fois que vous avez activé la désencapsulation de la charge utile, Pub/Sub ne définit pas automatiquement de champ d'en-tête de type de média dans votre requête. Si vous ne définissez pas explicitement de champ d'en-tête Content-Type
, le serveur Web qui traite votre requête peut définir une valeur par défaut de application/octet-stream
ou interpréter la requête de manière inattendue.
Si vous avez besoin d'un en-tête Content-Type
, veillez à le déclarer explicitement au moment de la publication dans chaque message publié. Pour ce faire, vous devez d'abord activer l'option Écrire des métadonnées. Ce résultat de l'activation de l'option Écrire les métadonnées est illustré dans les exemples fournis.
Étapes suivantes
- Si vous rencontrez des problèmes de désencapsulation de la charge utile, consultez Résoudre les problèmes de désencapsulation de la charge utile.