Al crear tu sistema Pub/Sub, el desempaquetado de la carga útil puede ayudarte a conectarte a otros sistemas que no cumplan todos los requisitos del sistema de una implementación estándar de endpoint de envío de Pub/Sub.
Estos son algunos casos prácticos potenciales para el desempaquetado de cargas útiles:
- No quieres escribir código de análisis de mensajes específico de Pub/Sub para tus endpoints de inserción HTTP.
- Prefieres recibir los metadatos de los mensajes de Pub/Sub como encabezados HTTP en lugar de en el cuerpo de la solicitud HTTP POST.
- Quieres enviar mensajes de Pub/Sub y excluir los metadatos de Pub/Sub, por ejemplo, al enviar datos a una API de terceros.
Cómo funciona el desempaquetado de la carga útil
El desempaquetado de la carga útil es una función que elimina de los mensajes de Pub/Sub todos los metadatos de los mensajes, excepto los datos de los mensajes. Al enviar datos de mensajes sin procesar, los suscriptores pueden procesar el mensaje sin tener que cumplir ningún requisito del sistema de Pub/Sub.
- Con el desempaquetado de la carga útil, los datos del mensaje se envían directamente como cuerpo HTTP.
- Sin el desempaquetado de la carga útil, Pub/Sub envía un objeto JSON que contiene varios campos de metadatos de mensajes y un campo de datos de mensajes. En este caso, el JSON debe analizarse para recuperar los datos del mensaje y, a continuación, decodificarse en base64.
Escribir metadatos
Después de habilitar el desempaquetado de la carga útil, puedes usar la opción Escribir metadatos, que añade los metadatos de los mensajes eliminados anteriormente al encabezado de la solicitud.
- Escribir metadatos habilitado. Vuelve a añadir los metadatos del mensaje al encabezado de la solicitud. También proporciona los datos del mensaje sin procesar y decodificados.
- Escritura de metadatos inhabilitada. Solo proporciona los datos del mensaje sin procesar y decodificados.
Los metadatos de escritura se exponen a través de Pub/Sub, el argumento --push-no-wrapper-write-metadata de la CLI de Google Cloud y la propiedad NoWrapper de la API.
De forma predeterminada, este valor es nulo.
Antes de empezar
- Consulta información sobre las suscripciones y las suscripciones push de Pub/Sub. El desempaquetado de la carga útil solo se puede usar con suscripciones push.
- Consulta cómo configurar una suscripción push.
Ejemplo de mensajes envueltos y sin envolver
En los siguientes ejemplos se muestra la diferencia entre enviar un mensaje HTTP envuelto y uno sin envolver. En estos ejemplos, los datos del mensaje contienen la cadena {"status": "Hello there"}.
En este ejemplo, se crea una suscripción con la función de desempaquetado de la carga útil habilitada y se publica un mensaje en mytopic. Usa una clave de ordenación con el valor some-key y el tipo de contenido multimedia se declara como application/json.
gcloud pubsub topics publish mytopic
--message='{"status": "Hello there"}'
--ordering-key="some-key"
--attribute "Content-Type=application/json"
En las siguientes secciones se muestra la diferencia entre un mensaje envuelto y uno sin envolver.
Mensaje envuelto
En el siguiente ejemplo se muestra un mensaje estándar envuelto de Pub/Sub. En este caso, no se ha habilitado el desempaquetado de la carga útil.
| Publicar | Recepción de endpoint de inserción |
|---|---|
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/..."
} |
Mensaje sin envolver con metadatos de escritura inhabilitados
En el siguiente ejemplo se muestra un mensaje sin envolver con la opción de metadatos de escritura inhabilitada. En este caso, no se incluyen los encabezados x-goog-pubsub-* ni los atributos de mensaje.
| Publicar | Push Endpoint Receives |
|---|---|