Desempaquetado de la carga útil de las suscripciones push de Pub/Sub

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

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