Volver a reproducir y eliminar mensajes con la función de búsqueda

Una vez que confirmas los mensajes en Pub/Sub, el cliente suscriptor no puede acceder a ellos. Además, los clientes suscriptores deben procesar todos los mensajes de una suscripción, aunque solo necesiten un subconjunto.

La función seek amplía las funciones de los suscriptores, ya que te permite modificar el estado de confirmación de los mensajes en bloque. Por ejemplo, puedes volver a reproducir mensajes que ya hayas confirmado o eliminar mensajes en bloque. Además, puedes copiar el estado de confirmación de una suscripción a otra usando la función de búsqueda junto con una captura.

Para ver una demostración rápida de cómo funcionan estas funciones, consulta Volver a reproducir un mensaje en Pub/Sub buscando una instantánea o una marca de tiempo.

Resumen de la función de captura y búsqueda

Una captura de Pub/Sub es una vista duradera, coherente y fiable del estado de confirmación de mensajes de una suscripción en un momento dado. Una captura registra el estado de confirmación de todos los mensajes de una suscripción en el momento de su creación. Una captura conserva los mensajes no confirmados de la suscripción de origen en el momento de crear la captura, así como los mensajes publicados en el tema después de crear la captura.

La duración de una captura viene determinada por el backlog de la suscripción de origen. El tiempo de vida es igual a 7 días menos la antigüedad del mensaje sin confirmar más antiguo de la suscripción. Por ejemplo, imagina una captura de una suscripción con trabajo acumulado en la que el mensaje sin confirmar más antiguo tiene 1 día. La copia caduca al cabo de 6 días. Esta cronología es necesaria para que las copias de seguridad ofrezcan una garantía de entrega sólida de al menos una vez.

El tiempo de vida máximo posible de una instantánea es de siete días. No puedes crear una captura que caduque en menos de una hora después de su creación.

La función de búsqueda te permite ir a una captura o una marca de tiempo específicas de una suscripción. Esta función te permite controlar cómo puede Pub/Sub enviar mensajes desde un momento concreto o desde una snapshot específica.

Para buscar un momento anterior y volver a reproducir los mensajes confirmados, primero debes configurar la conservación de mensajes en el tema o configurar la suscripción para que conserve los mensajes confirmados.

Coherencia final de las operaciones de búsqueda

Las operaciones de búsqueda son estrictamente coherentes en lo que respecta a la garantía de entrega de mensajes. Esto significa que cualquier mensaje que deje de estar confirmado en función de la condición de búsqueda se entregará finalmente después de que se complete la operación de búsqueda. Sin embargo, los mensajes entregados no se sincronizan al instante con la operación de búsqueda. Por lo tanto, es posible que se entregue un mensaje que se haya publicado antes de la marca de tiempo de la búsqueda o que se haya confirmado en una instantánea después de la operación de búsqueda. En cierto modo, el envío de mensajes funciona como un sistema de coherencia final con respecto a la operación de búsqueda. Esta operación puede tardar hasta un minuto en aplicarse por completo.

Casos prácticos de las operaciones de búsqueda

  • Actualiza el código de suscriptor de forma segura. Un problema que se plantea al implementar un nuevo código de suscriptor es que el nuevo ejecutable puede confirmar mensajes por error, lo que provoca la pérdida de mensajes. Incorporar copias de seguridad a tu proceso de implementación te permite recuperarte de errores en el nuevo código de suscriptor.
  • Recuperarse de problemas inesperados de los suscriptores. En los casos en los que los problemas de los suscriptores no estén asociados a un evento de implementación específico, es posible que no tengas una instantánea relevante. En este caso, si has habilitado la conservación de mensajes confirmados en una suscripción, buscar un momento anterior te permite recuperarte del error.
  • Ahorra tiempo y costes de procesamiento. Confirmar en bloque una gran cantidad de mensajes antiguos que ya no son relevantes.
  • Prueba el código de suscriptor con datos conocidos. Cuando se prueba el código de suscriptor para comprobar su rendimiento y coherencia, es útil usar los mismos datos en cada ejecución. Las capturas permiten que los datos sean coherentes y tengan una semántica sólida. Además, se pueden aplicar a cualquier suscripción de un tema concreto, incluida una que se haya creado recientemente.

Configurar la conservación de mensajes

Puedes configurar la retención de mensajes en un tema y configurar cualquiera de sus suscripciones para que retenga los mensajes confirmados. Puede configurar la retención de mensajes de temas si quiere que los mensajes se retengan para volver a reproducirlos durante un periodo superior al de la retención de mensajes configurada en la suscripción. En esta situación, se cobra al proyecto del tema y al proyecto de la suscripción por el almacenamiento de mensajes según sus respectivos ajustes de conservación de mensajes.

Si no se configura la conservación de mensajes del tema, un mensaje sin confirmar se elimina de la suscripción cuando su antigüedad supera la propiedad message_retention_duration de la suscripción. Por otro lado, si se configura la retención de mensajes del tema, el mensaje no confirmado se elimina de la suscripción solo cuando su antigüedad supera el máximo de los message_retention_durations del tema y de la suscripción.

Configurar la retención de mensajes de un tema

De forma predeterminada, un tema de Pub/Sub descarta los mensajes en cuanto todas las suscripciones asociadas al tema confirman que los han recibido. Configurar un tema con retención de mensajes te ofrece más flexibilidad, ya que permite que cualquier suscripción asociada al tema pueda retroceder en el tiempo y volver a reproducir los mensajes confirmados anteriormente hasta el message_retention_duration del tema. La retención de mensajes de temas también permite que una suscripción reproduzca mensajes que se hayan publicado antes de que crearas la suscripción.

Un tema puede retener los mensajes publicados durante un máximo de 31 días (se puede configurar mediante la propiedad message_retention_duration del tema) incluso después de que todas las suscripciones asociadas hayan confirmado su recepción. En los casos en los que el message_retention_duration del tema es mayor que el message_retention_duration de la suscripción, Pub/Sub descarta un mensaje solo cuando su antigüedad supera el message_retention_duration del tema.

Si la retención de mensajes del tema está habilitada, los costes de almacenamiento de los mensajes retenidos por el tema se facturan al proyecto del tema.

Consola

Para crear un tema con la retención de mensajes habilitada, sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Temas de Pub/Sub.

    Ir a la página de temas

  2. Haz clic en Crear tema.

  3. En el campo ID de tema, introduce un ID para el tema.

  4. Habilita Definir la duración de la conservación de los mensajes.

    Deja el resto de las opciones con sus ajustes predeterminados.

  5. Usa el menú desplegable Duración de conservación de mensajes para seleccionar el número de días, horas y minutos que quieres conservar los mensajes.

  6. Haz clic en Crear tema para guardar el tema.

Para actualizar los ajustes de retención de mensajes de un tema, sigue estos pasos:

  1. Selecciona el tema en la página Temas de Pub/Sub.

    Ir a la página de temas

  2. En la parte superior de la página de detalles del tema, haz clic en Editar.

  3. Ajusta el tiempo de conservación o habilita o inhabilita la conservación de mensajes marcando o desmarcando la opción Habilitar conservación de mensajes.

  4. Haz clic en Actualizar para guardar los cambios en el tema.

gcloud

Para crear un tema con una duración de retención de mensajes de 7 días, usa el siguiente comando gcloud pubsub topics create:

gcloud pubsub topics create TOPIC_ID --message-retention-duration=7d

Puedes cambiar esta opción con gcloud pubsub topics update . También puedes habilitar la retención de mensajes en un tema que ya tengas:

gcloud pubsub topics update TOPIC_ID --message-retention-duration=1d

También puedes inhabilitar la conservación de mensajes de un tema con el comando update:

gcloud pubsub topics update TOPIC_ID --clear-message-retention-duration

Configurar la retención de mensajes de suscripción

Pub/Sub empieza a conservar los mensajes en nombre de una suscripción cuando se crea la suscripción. De forma predeterminada, Pub/Sub descarta un mensaje de una suscripción en cuanto se confirma. Los mensajes sin confirmar se conservan durante 7 días de forma predeterminada (se puede configurar mediante la propiedad message_retention_duration de la suscripción).

Si configura una suscripción para que retenga los mensajes confirmados (mediante la propiedad retain_acked_messages ), podrá reproducir los mensajes confirmados anteriormente que haya retenido la suscripción. Puedes configurar las suscripciones para que conserven los mensajes durante un máximo de 31 días. Esta configuración se aplica tanto a los mensajes confirmados como a los no confirmados.

Si una suscripción está configurada para retener mensajes confirmados, los costes de almacenamiento de los mensajes confirmados retenidos por la suscripción se facturan al proyecto de la suscripción.

Consola

Para crear una suscripción con la retención de mensajes confirmados habilitada, sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Suscripciones de Pub/Sub.

    Ir a la página de suscripciones

  2. Haz clic en Crear suscripción.

  3. En el campo ID de suscripción, introduce un ID para tu suscripción.

  4. Usa el menú desplegable Duración de conservación de mensajes para seleccionar el número de días, horas y minutos que quieres conservar los mensajes.

  5. Habilita Conservar mensajes confirmados. Deja el resto de las opciones con sus ajustes predeterminados.

  6. Haz clic en Crear suscripción para guardar la suscripción.

Para actualizar los ajustes de conservación de mensajes de una suscripción, sigue estos pasos:

  1. Selecciona tu suscripción en la página Suscripciones de Pub/Sub.

    Ir a la página de suscripciones

  2. En la parte superior de la página de detalles de la suscripción, haz clic en Editar.

  3. Ajusta la duración de la conservación de los mensajes o habilita o inhabilita la conservación de los mensajes confirmados marcando o desmarcando el campo Conservar mensajes confirmados.

  4. Haz clic en Actualizar para guardar los cambios en la suscripción.

gcloud

Para crear una suscripción con la retención de mensajes confirmados habilitada, usa el siguiente comando gcloud pubsub subscriptions create:

gcloud pubsub subscriptions create SUBSCRIPTION_ID
    --retain-acked-messages
    --message-retention-duration=5d

Puedes cambiar este ajuste con gcloud pubsub subscriptions update . También puedes habilitar la retención de mensajes confirmados en una suscripción que ya tengas:

gcloud pubsub subscriptions update SUBSCRIPTION_ID --message-retention-duration=1d

También puedes inhabilitar la conservación de los mensajes confirmados de una suscripción con el comando update:

gcloud pubsub subscriptions update SUBSCRIPTION_ID --no-retain-acked-messages

Crear una captura

Puedes crear una instantánea mediante la consola, las APIs de Google o la CLI de Google Cloud.

Consola

Para crear una instantánea, sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Snapshots (Capturas).

    Ir a la página de las capturas

  2. Haz clic en Crear copia.

  3. En Seleccionar una suscripción de Pub/Sub, elige una suscripción.

  4. En ID de la captura, introduce un nombre para la captura.

    Para obtener más información sobre cómo asignar nombres a los recursos de Pub/Sub, consulta las directrices para asignar nombres a temas, suscripciones, esquemas o copias de seguridad.

  5. Haz clic en Crear para crear la instantánea.

También puedes crear una captura desde la página Suscripciones. Si creas una captura inmediatamente después de crear una suscripción, es posible que se produzca un error debido al retraso de propagación de la suscripción recién creada.

gcloud

Para crear una captura, usa el siguiente comando:gcloud pubsub snapshots create

gcloud pubsub snapshots create \
    --project=PROJECT_ID \
    --subscription=SUBSCRIPTION_ID \
    SNAPSHOT_ID

Haz los cambios siguientes:

  • PROJECT_ID. Especifica el ID del proyecto.

  • SUBSCRIPTION_ID. Especifica el ID de la suscripción.

  • SNAPSHOT_ID. Especifica el ID de la captura.

Ir a una marca de tiempo

Si se busca un momento concreto, se marcarán como confirmados todos los mensajes que Pub/Sub haya recibido antes de ese momento y como no confirmados todos los mensajes que haya recibido después.

Puedes realizar los siguientes tipos de operaciones de búsqueda basadas en marcas de tiempo:

  • Para eliminar definitivamente todos los mensajes, puedes ir a un momento posterior.

  • Para volver a reproducir y reprocesar mensajes confirmados anteriormente, busca un momento anterior.

Los servidores de Pub/Sub generan la hora de publicación del mensaje (consulta publishTime en la referencia de la API). Este enfoque es impreciso por los siguientes motivos:

  • Posible desfase entre los relojes de los servidores de Pub/Sub.

  • El hecho de que Pub/Sub tenga que trabajar con la hora de llegada de la solicitud de publicación en lugar de cuando se produjo un evento en el sistema de origen.

Puedes buscar una marca de tiempo mediante la consola, las APIs de Google o la CLI de Google Cloud. Antes de buscar una marca de tiempo en una suscripción, comprueba que la retención de mensajes esté habilitada en la suscripción.

Consola

Para ir a una marca de tiempo, sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Suscripción.

    Ir a Suscripción

  2. Haz clic en una suscripción que tenga habilitada la conservación de mensajes.

  3. En la página de detalles de la suscripción, haz clic en Reproducir mensajes.

  4. En Buscar, haz clic en En un momento anterior determinado.

  5. Selecciona una fecha y una hora adecuadas y, a continuación, haz clic en Buscar.

gcloud

Para ir a una marca de tiempo, usa el siguiente comando:gcloud pubsub subscriptions seek

gcloud pubsub subscriptions seek SUBSCRIPTION_ID \
    --time=TIME \

Haz los cambios siguientes:

  • TIME: el momento al que quieres ir.
  • SUBSCRIPTION_ID: el ID de la suscripción.

Para obtener más información sobre los formatos de hora admitidos, consulta gcloud topic datetimes.

Buscar en una captura

Puedes volver a reproducir mensajes no confirmados usando una captura para buscar en cualquiera de las suscripciones del tema.

A diferencia de cuando se busca un momento concreto, no es necesario que configures ninguna suscripción especial para buscar una captura. Solo tienes que crear la captura con antelación. Por ejemplo, puedes crear una instantánea al implementar un nuevo código de suscriptor por si necesitas recuperarte de confirmaciones inesperadas o erróneas.

Si el backlog de la suscripción es demasiado antiguo y la captura resultante caducaría en menos de una hora, la operación de búsqueda fallará.

Puedes buscar una snapshot mediante la consola, las APIs de Google o la CLI de Google Cloud.

Consola

Para buscar una instantánea, sigue estos pasos:

  1. En la Google Cloud consola, ve a la página Suscripción.

    Ir a Suscripción

  2. Haz clic en una suscripción.

  3. En la página de detalles de la suscripción, haz clic en Reproducir mensajes.

  4. En Buscar, haz clic en A una captura.

  5. Selecciona una instantánea adecuada y haz clic en Buscar.

gcloud

Para buscar una captura, usa el siguiente comando:gcloud pubsub subscriptions seek

gcloud pubsub subscriptions seek SUBSCRIPTION_ID \
    --snapshot=SNAPSHOT_ID

Haz los cambios siguientes:

  • SNAPSHOT_ID: el ID de una captura. El tema de la instantánea debe ser el mismo que el de la suscripción.
  • SUBSCRIPTION_ID: el ID de la suscripción.

Buscar con filtros

Puedes reproducir mensajes de suscripciones con filtros. Si te desplazas a una marca de tiempo mediante una suscripción con un filtro, el servicio Pub/Sub solo vuelve a enviar los mensajes que coincidan con el filtro.

Una captura de una suscripción con un filtro contiene los siguientes mensajes:

  • Todos los mensajes posteriores a la instantánea, incluidos los que no coinciden con el filtro.
  • Mensajes sin confirmar que sean anteriores a la captura.

Si buscas una captura con una suscripción que tiene un filtro, el servicio Pub/Sub solo vuelve a enviar los mensajes de la captura que coincidan con el filtro de la suscripción que hace la solicitud de búsqueda.

Para obtener más información sobre los filtros, consulta Filtrar mensajes.

Búsqueda con temas de mensajes fallidos

Si buscas mensajes en una suscripción con un tema de mensajes fallidos, Pub/Sub asigna el valor 0 a los intentos de entrega. Los mensajes que recibes de estas suscripciones tienen un campo que contabiliza el número de intentos de entrega.

Para obtener más información sobre los temas de mensajes fallidos, consulta Reenviar a temas de mensajes fallidos.

Búsqueda con políticas de reintentos

Si buscas mensajes en una suscripción con una política de reintentos, Pub/Sub restablece el retraso entre lo siguiente:

  1. Si la fecha límite de confirmación caduca o si el suscriptor envía una confirmación negativa.
  2. Pub/Sub vuelve a enviar el mensaje.

Para obtener más información sobre las políticas de reintento, consulta Usar políticas de reintento.

Búsqueda con entrega exacta

Si buscas mensajes en una suscripción con entrega exactamente una vez, Pub/Sub vuelve a enviar los mensajes confirmados anteriormente que se pueden entregar. Las confirmaciones de una entrega realizada antes de la operación de búsqueda fallarán. Las operaciones de búsqueda son coherentes con el tiempo.

Para obtener más información sobre las políticas de reintento, consulta Entrega exactamente una vez.