Vuelve a reproducir y borra definitivamente mensajes

Las API de datos de suscriptores de Pub/Sub, como extracción, proporcionan acceso limitado a los datos de los mensajes. Por lo general, los suscriptores de una suscripción determinada no pueden acceder a los mensajes confirmados. Además, los clientes suscriptores deben procesar todos los mensajes de una suscripción, incluso si solo se necesita un subconjunto.

La función Búsqueda amplía la funcionalidad del suscriptor, ya que te permite modificar el estado de confirmación de los mensajes de forma masiva. Por ejemplo, puedes reproducir mensajes ya confirmados o borrar definitivamente mensajes de forma masiva. Además, puedes copiar el estado de una suscripción en otra mediante la búsqueda en combinación con una Instantánea.

Estas funciones se describen a continuación. Sin embargo, puedes consultar la guía de inicio rápido para ver un ejemplo funcional.

Configura la retención de mensajes

Para buscar una hora anterior y volver a reproducir mensajes ya confirmados, primero debes configurar la retención de mensajes en el tema o configurar la suscripción para que retenga los mensajes confirmados.

Si no se configura la retención de mensajes por temas, se borra de la suscripción un mensaje no confirmado cuando esta excede la propiedad message_retention_duration de la suscripción. Por otro lado, si se configura la retención de mensajes por temas, el mensaje no confirmado se borra de la suscripción solo cuando su antigüedad supera el máximo de los message_retention_duration de los temas y las suscripciones.

Retención de mensajes por temas

De forma predeterminada, un tema de Pub/Sub descarta los mensajes en cuanto los reconocen todas las suscripciones adjuntas al tema. La configuración de un tema con la retención de mensajes te brinda más flexibilidad, lo que permite que cualquier suscripción adjunta al tema busque en el tiempo y reproduzca los mensajes confirmados hasta el tema message_retention_duration. La retención de mensajes por temas también permite que una suscripción vuelva a reproducir los mensajes que se publican antes de crearla.

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

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

Console

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

  1. En Console, ve a la página Temas de Pub/Sub.

    Ir a la página de temas

  2. Haga clic en Crear tema.

  3. En el campo ID de tema, ingresa un ID para tu tema.

  4. Marca la casilla Establecer la duración de la retención de mensajes. Deja las otras opciones de configuración con sus valores predeterminados.

  5. Usa los menús desplegables de Duración de la retención de mensajes para seleccionar la cantidad de días, horas y minutos que deseas retener los mensajes.

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

Para actualizar la configuración de retención de mensajes de un tema, haz lo siguiente:

  1. Selecciona tu tema en la página de temas de Pub/Sub.

    Ir a la página de temas

  2. Haz clic en Editar en la parte superior de la página de detalles del tema.

  3. Para ajustar el tiempo de retención o habilitar o inhabilitar la retención de mensajes, marca o desmarca la casilla Habilitar la retenció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 actualizar esta configuración mediante gcloud pubsub topics update. Esto también te permite habilitar la retención de mensajes para un tema existente:

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

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

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

Retención de mensajes de suscripción

De forma predeterminada, las suscripciones descartan los mensajes apenas se confirman. Los mensajes no confirmados se conservan durante un período predeterminado de 7 días (se puede configurar con la propiedad message_retention_duration de la suscripción). Configurar una suscripción para retener los mensajes confirmados (a través de la propiedad retain_acked_messages) te permite volver a reproducir los mensajes previamente confirmados por la suscripción. Puedes configurar la retención de mensajes durante un máximo de 7 días en una suscripción. Esta configuración se aplica a los mensajes confirmados y no confirmados. Sin embargo, se pueden conservar los mensajes en una suscripción por más de 7 días si la duración de retención de mensajes configurada en su tema es superior a 7 días.

Si se configura una suscripción para que retenga los mensajes confirmados, los costos de almacenamiento de los mensajes confirmados que retenga la suscripción se facturarán al proyecto de la suscripción.

Console

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

  1. En Console, 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, ingresa un ID para tu suscripción.

  4. Usa los menús desplegables de Duración de la retención de mensajes para seleccionar la cantidad de días, horas y minutos que deseas retener los mensajes.

  5. Marca la casilla Retener mensajes confirmados. Deja las otras opciones de configuración con sus valores predeterminados.

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

Para actualizar la configuración de la retención de mensajes de una suscripción, haz lo siguiente:

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

    Ir a la página de suscripciones

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

  3. Para ajustar la duración de la retención de mensajes o habilitar o inhabilitar la retención de mensajes confirmados, marca o desmarca la casilla Retener 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=true
    --message-retention-duration=5d

Puedes actualizar esta configuración mediante gcloud pubsub subscriptions update. Esto también te permite habilitar la retención de mensajes confirmados para una suscripción existente:

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

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

gcloud pubsub subscriptions update SUBSCRIPTION_ID --retain-acked-messages=false

Busca una marca de tiempo

Cuando se busca un horario, se marcan todos los mensajes recibidos por Pub/Sub antes de ese horario como confirmados y todos los mensajes recibidos después como no confirmados. Puedes buscar un horario en el futuro para borrar definitivamente mensajes. Para volver a reproducir y procesar mensajes ya confirmados, busca un horario 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 debido a los siguientes motivos:

  • Un posible sesgo del reloj entre los servidores Pub/Sub

  • El hecho de que Pub/Sub tenga que trabajar con el horario de llegada de la solicitud de publicación en lugar de hacerlo cuando ocurre un evento en el sistema de origen

Busca una instantánea

La función de instantánea te permite capturar el estado de confirmación del mensaje de una suscripción. Una vez que se crea una instantánea, conserva lo siguiente:

  • Todos los mensajes no confirmados en la suscripción de origen en el momento en que se creó la instantánea

  • Todos los mensajes publicados en el tema a partir de ese momento

Puedes volver a reproducir estos mensajes no confirmados si usas una instantánea para buscar cualquiera de las suscripciones del tema.

A diferencia de la búsqueda de un horario, no necesitas realizar ninguna configuración de suscripción especial para buscar una instantánea. Solo debes crear la instantánea con anticipación. Por ejemplo, puedes crear una instantánea cuando implementes un código nuevo de suscriptor, en caso de que necesites solucionar confirmaciones inesperadas o erróneas.

Las instantáneas se vencen y se borran en los siguientes casos (lo que ocurra primero):

  • La instantánea alcanza una vida útil de siete días.
  • El mensaje no confirmado más antiguo de la instantánea supera la message retention duration.

Por ejemplo, imagina una instantánea de una suscripción con una tarea pendiente en la que el mensaje no confirmado más antiguo tiene un día de antigüedad. La instantánea se vence después de seis días, en lugar de siete. Esta línea de tiempo es necesaria para que las instantáneas ofrezcan garantías de entrega sólidas al menos una vez.

Coherencia eventual

Las operaciones de búsqueda son estrictamente coherentes con respecto a las garantías de entrega de mensajes. Eso significa que cualquier mensaje que se confirme como no confirmado en función de la condición de búsqueda se garantizará luego de que la operación de búsqueda se complete con éxito. Sin embargo, los mensajes enviados no son coherentes de inmediato con la operación de búsqueda. Por lo tanto, un mensaje que se publicó antes de la marca de tiempo de búsqueda o que se confirmó en una instantánea podría entregarse después de la operación de búsqueda. En cierto sentido, la entrega de mensajes funciona como un sistema de coherencia eventual con respecto a la operación de búsqueda: la operación puede tardar hasta un minuto para surtir efecto.

Busca con filtros

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

Una instantánea de una suscripción con un filtro contiene los siguientes mensajes:

  • Todos los mensajes más nuevos que la instantánea, incluidos los mensajes que no coinciden con el filtro.
  • Mensajes no confirmados que son más antiguos que la instantánea.

Si buscas una instantánea mediante una suscripción con un filtro, el servicio de Pub/Sub solo vuelve a entregar los mensajes en la instantánea que coinciden con el filtro de la suscripción que realiza la solicitud de búsqueda.

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

Busca temas de mensajes no entregados

Si buscas mensajes en una suscripción con un tema de mensajes no entregados, Pub/Sub establece los intentos de entrega como 0. Los mensajes que recibes de estas suscripciones tienen un campo que cuenta la cantidad de intentos de entrega.

Para obtener más información sobre los temas de mensajes no entregados, consulta Reenvío a temas de mensajes no entregados.

Busca con políticas de reintento

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

  1. El plazo de confirmación de recepción vence o el suscriptor envía una confirmación de recepción negativa.
  2. Pub/Sub reenvía el mensaje.

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

Busca exactamente un producto con entrega a domicilio

Si buscas mensajes en una suscripción que tenga exactamente una entrega, Pub/Sub te reenviará los mensajes previamente confirmados que son aptos para la entrega. Cualquier confirmación de una publicación realizada antes de la operación de búsqueda fallará. Las operaciones de búsqueda tienen coherencia eventual.

Para obtener más información sobre las políticas de reintento, consulta Exactamente una vez en la entrega.

Casos de uso

  • Actualiza el código de suscriptor de forma segura. Un problema con la implementación de un nuevo código de suscriptor es que el ejecutable nuevo puede confirmar mensajes de forma errónea, lo que puede provocar la pérdida de mensajes. La incorporación de instantáneas en el proceso de implementación te permite recuperarte antes errores en el nuevo código de suscriptor.
  • Recupérate ante problemas inesperados de suscriptores. En los casos en los que los problemas del suscriptor no estén asociados con un evento de implementación específico, es posible que no tengas una instantánea relevante. En ese caso, si habilitaste la retención de mensajes confirmados para una suscripción, la búsqueda de un horario anterior te brinda una forma de recuperarte ante el error.
  • Reduce los costos y el tiempo de procesamiento. Realiza una confirmación masiva de una gran cantidad de mensajes pendientes que ya no son relevantes.
  • Prueba el código del suscriptor en datos conocidos. Cuando se prueba el rendimiento y la coherencia del código del suscriptor, es útil usar los mismos datos en cada ejecución. Las instantáneas son compatibles con datos coherentes con una semántica sólida. Además, las instantáneas se pueden aplicar a cualquier suscripción a un tema determinado, incluso una nueva.

¿Qué sigue?

Puedes usar Pub/Sub con Dataflow. Sin embargo, no recomendamos el acceso directo a Pub/Sub Seek desde una canalización de Dataflow en ejecución. Para obtener información sobre el flujo de trabajo recomendado, consulta la página sobre cómo usar la función de búsqueda de Cloud Pub/Sub con Dataflow.