Cuando compilas tu sistema de Pub/Sub, la separación de la carga útil puede ayudarte a conectarte con otros sistemas que no cumplen con todos los requisitos del sistema de una implementación estándar del extremo de envío de Pub/Sub.
Estos son algunos casos de uso potenciales para la separación de la carga útil:
- No quieres escribir código de análisis de mensajes específico de Pub/Sub para tus extremos de envío HTTP.
- Prefieres recibir los metadatos de los mensajes de Pub/Sub como encabezados HTTP en lugar de los metadatos en el cuerpo de HTTP POST.
- Quieres enviar mensajes de Pub/Sub y excluir los metadatos de Pub/Sub, por ejemplo, cuando envías datos a una API de terceros.
Cómo funciona la separación de la carga útil
La separación de la carga útil es una función que quita todos los metadatos de los mensajes de Pub/Sub, excepto los datos del mensaje. Cuando envían datos de mensajes sin procesar, los suscriptores pueden procesar el mensaje sin tener que cumplir con los requisitos del sistema de Pub/Sub.
- Con la separación de la carga útil, los datos del mensaje se entregan directamente como el cuerpo HTTP.
- Sin la separación de la carga útil, Pub/Sub entrega un objeto JSON que contiene varios campos de metadatos de mensajes y un campo de datos de mensajes. En este caso, se debe analizar el JSON para recuperar los datos del mensaje y, luego, decodificarlo en base64.
Escribir metadatos
Después de habilitar la separación de la carga útil, puedes usar la opción escribir metadatos que agrega los metadatos del mensaje que se quitaron anteriormente al encabezado de la solicitud.
- Escribir metadatos habilitado. Vuelve a agregar los metadatos del mensaje al encabezado de la solicitud. También entrega los datos de mensajes decodificados sin procesar.
- Escribir metadatos inhabilitado. Solo entrega los datos de mensajes decodificados sin procesar.
La escritura de metadatos se expone a través de Pub/Sub, Google Cloud CLI
argumento --push-no-wrapper-write-metadata, y la propiedad de la API NoWrapper.
De forma predeterminada, este valor es nulo.
Antes de comenzar
- Obtén información sobre las suscripciones a Pub/Sub y las suscripciones de envío. La separación de la carga útil solo se puede usar con suscripciones de envío.
- Obtén información para configurar una suscripción de envío.
Ejemplo de mensajes encapsulados y no encapsulados
En los siguientes ejemplos, se ilustra la diferencia entre enviar un mensaje HTTP encapsulado y uno no encapsulado. 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 separación de la carga útil habilitada y se publica un mensaje en mytopic. Usa una clave de ordenamiento con un valor de some-key y el tipo de medio 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 encapsulado y uno no encapsulado.
Mensaje encapsulado
En el siguiente ejemplo, se muestra un mensaje encapsulado estándar de Pub/Sub. En este caso, la separación de la carga útil no está habilitada.
| Publicar | El extremo de envío recibe |
|---|---|
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 no encapsulado con la escritura de metadatos inhabilitada
En el siguiente ejemplo, se muestra un mensaje no encapsulado con la opción de escritura de metadatos inhabilitada. En este caso, no se incluyen los encabezados x-goog-pubsub-* ni los atributos del mensaje.
| Publicar | El extremo de envío recibe |
|---|---|
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 no encapsulado con la escritura de metadatos habilitada
En el siguiente ejemplo, se muestra un mensaje no encapsulado con la opción de escritura de metadatos habilitada. En este caso, se incluyen los encabezados x-goog-pubsub-* y los atributos del mensaje.
| Publicar | El extremo de envío recibe |
|---|---|
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"} |
Configura la separación de la carga útil
Puedes habilitar la entrega de envío de separación de la carga útil para una suscripción con la Google Cloud consola Detalles de la suscripción página, Google Cloud CLI, o las bibliotecas cliente.
Console
En la Google Cloud consola, ve a la página Suscripciones.
Haz clic en Crear suscripción.
En el campo ID de la suscripción, ingresa un nombre.
Para obtener información sobre cómo asignar un nombre a una suscripción, consulta los Lineamientos para asignar un nombre a un tema o una suscripción.
Selecciona un tema del menú desplegable. La suscripción recibe mensajes del tema.
En Tipo de entrega, selecciona Envío.
Para habilitar la separación de la carga útil, selecciona Habilitar la separación de la carga útil.
(Opcional) Para conservar los metadatos de los mensajes en el encabezado de la solicitud, selecciona Escribir metadatos. Debes habilitar esta opción para establecer un encabezado Content-Type para tus mensajes.
Especifica una URL de extremo.
Conserva todos los demás valores predeterminados.
Haz clic en Crear.
gcloud
Para configurar una suscripción con separación de la carga útil que incluya encabezados HTTP estándar
HTTP, ejecuta el siguiente gcloud pubsub subscriptions create
comando:
gcloud pubsub subscriptions create SUBSCRIPTION \ --topic TOPIC \ --push-endpoint=PUSH_ENDPOINT \ --push-no-wrapper
Reemplaza lo siguiente:
SUBSCRIPTION: El nombre o el ID de tu suscripción de envío.TOPIC: El ID del tema.PUSH_ENDPOINT: La URL que se usará como extremo para esta suscripción. Por ejemplo,https://myproject.appspot.com/myhandler--push-no-wrapper: Entrega los datos del mensaje directamente como el cuerpo HTTP.
Para configurar una suscripción con separación de la carga útil y controlar el uso de 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: Cuando es verdadero, escribe los metadatos del mensaje de Pub/Sub en losx-goog-pubsub-<KEY>:<VAL>encabezados 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 esta muestra, sigue las instrucciones de configuración de Python en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Python de Pub/Sub .
Java
Antes de probar esta muestra, sigue las instrucciones de configuración de Java en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Java .
C++
Antes de probar esta muestra, sigue las instrucciones de configuración de C++ en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para C++ .
Go
En la siguiente muestra, se usa la versión principal de la biblioteca cliente de Pub/Sub para Go (v2). Si aún usas la biblioteca v1, consulta la guía de migración a la v2. Para ver una lista de muestras de código de la v1, consulta las muestras de código obsoletas.
Antes de probar esta muestra, sigue las instrucciones de configuración de Go en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Go.
Node.js
Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Node.js.
Node.js
Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js en la guía de inicio rápido sobre el uso de bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Node.js.
Establece un encabezado content-type en tu mensaje
Después de habilitar la separación de la carga útil, Pub/Sub no establece automáticamente un campo de encabezado de tipo de medio en tu solicitud. Si no estableces de forma explícita un campo de encabezado Content-Type, el servidor web
que procesa tu solicitud podría establecer un valor predeterminado de
application/octet-stream
o interpretar la solicitud de una manera inesperada.
Si necesitas un encabezado Content-Type, asegúrate de declararlo de forma explícita en el momento de la publicación para cada mensaje publicado individual. Para ello, primero debes habilitar Escribir metadatos. El resultado de habilitar Escribir metadatos
se muestra en los ejemplos proporcionados.
¿Qué sigue?
- Si tienes problemas con la separación de la carga útil, consulta Solución de problemas de la separación de la carga útil.