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 del deswrap 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 recibirlos 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, excepto los datos del mensaje. 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 que se hayan eliminado 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 sin procesar y decodificados del mensaje.
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 | Recepción de endpoint de inserción |
---|---|
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"} |
Mensaje sin envolver con metadatos de escritura habilitados
En el siguiente ejemplo se muestra un mensaje sin envolver con la opción de metadatos de escritura habilitada. En este caso, se incluyen los encabezados x-goog-pubsub-*
y los atributos del mensaje.
Publicar | Recepción de endpoint de inserción |
---|---|
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"} |
Configurar la retirada de envoltorio de la carga útil
Puedes habilitar el envío push de desencapsulado de carga útil para una suscripción mediante la página Detalles de la suscripción de la consola Google Cloud , la CLI de Google Cloud o las bibliotecas de cliente.
Consola
En la Google Cloud consola, ve a la página Suscripciones.
Haz clic en Crear suscripción.
En el campo ID de suscripción, introduce un nombre.
Para obtener información sobre cómo asignar un nombre a una suscripción, consulta las directrices para asignar un nombre a un tema o a una suscripción.
Selecciona un tema en el menú desplegable. La suscripción recibe mensajes del tema.
En Tipo de envío, selecciona Envío.
Para habilitar el desempaquetado de la carga útil, selecciona Habilitar desempaquetado de la carga útil.
(Opcional) Para conservar los metadatos de los mensajes en la cabecera de la solicitud, selecciona Escribir metadatos. Debe habilitar esta opción para definir un encabezado Content-Type en sus mensajes.
Especifica una URL de endpoint.
Mantén el resto de los valores predeterminados.
Haz clic en Crear.
gcloud
Para configurar una suscripción con el desempaquetado de la carga útil que incluya cabeceras HTTP estándar, ejecuta el siguiente comando gcloud pubsub subscriptions create
:
gcloud pubsub subscriptions create SUBSCRIPTION \ --topic TOPIC \ --push-endpoint=PUSH_ENDPOINT \ --push-no-wrapper
Haz los cambios siguientes:
SUBSCRIPTION
: el nombre o el ID de tu suscripción de extracción.TOPIC
: el ID del tema.PUSH_ENDPOINT
: URL que se va a usar como endpoint de esta suscripción. Por ejemplo,https://myproject.appspot.com/myhandler
--push-no-wrapper
: entrega los datos del mensaje directamente como cuerpo HTTP.
Para configurar una suscripción con el desempaquetado de la carga útil y controlar el uso de los encabezados x-goog-pubsub-*
, ejecuta el siguiente comando:
gcloud pubsub subscriptions create SUBSCRIPTION \ --topic TOPIC \ --push-endpoint=PUSH_ENDPOINT \ --push-no-wrapper \ --push-no-wrapper-write-metadata
--push-no-wrapper-write-metadata
: si es true, escribe los metadatos del mensaje de Pub/Sub en los encabezadosx-goog-pubsub-<KEY>:<VAL>
de la solicitud HTTP. Escribe los atributos del mensaje de Pub/Sub en los encabezados<KEY>:<VAL>
de la solicitud HTTP.
Python
Antes de probar este ejemplo, sigue las instrucciones de configuración de Python que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Python de Pub/Sub.
Java
Antes de probar este ejemplo, sigue las instrucciones de configuración de Java que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Java de Pub/Sub.
C++
Antes de probar este ejemplo, sigue las instrucciones de configuración de C++ que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de C++ de Pub/Sub.
Go
En el siguiente ejemplo se usa la versión principal de la biblioteca de cliente de Pub/Sub de Go (v2). Si sigues usando la biblioteca v1, consulta la guía de migración a la versión 2. Para ver una lista de ejemplos de código de la versión 1, consulta los ejemplos de código obsoletos.
Antes de probar este ejemplo, sigue las instrucciones de configuración de Go que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Go de Pub/Sub.
Node.js
Antes de probar este ejemplo, sigue las instrucciones de configuración de Node.js que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Node.js de Pub/Sub.
Node.js
Antes de probar este ejemplo, sigue las instrucciones de configuración de Node.js que se indican en la guía de inicio rápido sobre cómo usar bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API de Node.js de Pub/Sub.
Definir un encabezado Content-Type en el mensaje
Después de habilitar el desempaquetado de la carga útil, Pub/Sub no define automáticamente un campo de encabezado de tipo de medio en tu solicitud. Si no defines explícitamente un campo de encabezado Content-Type
, es posible que el servidor web que procese tu solicitud asigne un valor predeterminado de application/octet-stream
o interprete la solicitud de forma inesperada.
Si necesitas un encabezado Content-Type
, asegúrate de declararlo explícitamente
en el momento de la publicación de cada mensaje. Para ello, primero debes habilitar Escribir metadatos. El resultado de habilitar Escribir metadatos
se muestra en los ejemplos proporcionados.
Siguientes pasos
- Si tienes problemas con el desempaquetado de la carga útil, consulta Solucionar problemas con el desempaquetado de la carga útil.