En esta página, se explica cómo recibir y confirmar mensajes usando la función “exactamente una vez” de Pub/Sub, que te permite para rastrear y evitar el procesamiento duplicado de los mensajes. Cuando la función es Pub/Sub proporciona la siguiente semántica:
Los suscriptores pueden determinar si los mensajes de acuse de recibo se entregaron correctamente.
No se vuelve a entregar el mensaje una vez que se confirma correctamente el mensaje.
No se vuelve a entregar un mensaje mientras está pendiente. Un mensaje se considera pendiente hasta que venza el plazo de confirmación o hasta que el mensaje se confirmar.
En el caso de varias publicaciones válidas, debido al vencimiento del plazo de confirmación o a la confirmación negativa que inicia el cliente, solo se puede usar el ID de confirmación más reciente para confirmar el mensaje. Todas las solicitudes con falla un ID de confirmación anterior.
Con la opción “exactamente una vez” habilitada, los suscriptores pueden asegurarse de que los mensajes se procesen uno tiempo siguiendo estas pautas:
Confirma mensajes dentro del plazo límite.
Conservar información sobre el progreso del procesamiento de un mensaje hasta que se se confirmó correctamente.
Usa la información sobre el progreso del procesamiento de un mensaje para evitar y duplica el trabajo cuando falla una confirmación de recepción.
Solo el tipo de suscripción de extracción admite la entrega “exactamente una vez”, incluidos los suscriptores que usan API de StreamingPull. Las suscripciones de envío y exportación no admiten la entrega exactamente una vez.
Pub/Sub admite la entrega de “exactamente una vez”, dentro de una región de nube, basada en un ID de mensaje único definido por Pub/Sub.
Versiones recomendadas de la biblioteca cliente
- Para obtener el mejor rendimiento, usa la versión más reciente de la biblioteca cliente, Python v2.13.6 o una posterior, Java v1.120.11 o una posterior, PHP v1.39.0 o una posterior, C# v3.2.0 o una posterior, C++ v2.1.0, Go v1.25.1 o una posterior, Node v3.2.0 o una posterior y Ruby v2.12.1 o una posterior.
Republicación en comparación con duplicado
Es importante entender la diferencia entre lo esperado e inesperado entregas nuevas.
Un reintento de la entrega puede ocurrir debido a respuestas negativas iniciadas por el cliente la confirmación de un mensaje o cuando el cliente no extiende la confirmación del plazo límite del mensaje antes de que caduque el plazo de confirmación. Las reentregas se consideran válidas y el sistema funciona según lo previsto.
Para solucionar problemas relacionados con las reenviaciones, consulta Cómo lidiar con duplicados.
Un duplicado ocurre cuando un mensaje se vuelve a enviar después de una confirmación correcta. o antes de que venza el plazo de confirmación.
Un mensaje reenviado conserva el mismo ID de mensaje entre los intentos de reenvío.
Las suscripciones que tienen habilitada la opción “exactamente una vez” no reciben datos duplicados entregas.
Compatibilidad con la entrega “exactamente una vez” en las bibliotecas cliente
Las bibliotecas cliente compatibles tienen una interfaz para el acuse de recibo con respuesta (por ejemplo, Go). Puedes usar esta interfaz para verificar si la solicitud de acuse de recibo se realizó correctamente. Si la solicitud de confirmación de recepción se realiza con éxito, se garantiza que los clientes no reciben una nueva entrega. Si la solicitud de confirmación falla, el los clientes pueden esperar una entrega nueva.
Los clientes también pueden usar las bibliotecas cliente compatibles sin el de confirmación de recepción. Sin embargo, en esos casos, Las fallas de confirmación de recepción pueden provocar que los mensajes se vuelvan a entregar en silencio.
Las bibliotecas cliente admitidas tienen interfaces para establecer el tiempo mínimo de extensión del arrendamiento (por ejemplo, Go). Debes establecer un número alto para la extensión de retención mínima. para evitar que caduquen los reconocimientos relacionados con la red. El valor máximo se establece en 600 segundos.
Los valores y el rango predeterminados de las variables relacionadas con la entrega exactamente una vez y los nombres de las variables pueden diferir entre las bibliotecas cliente. Para Por ejemplo, en la biblioteca cliente de Java, las siguientes variables controlan entrega “exactamente una vez”.
Variable | Descripción | Valor |
---|---|---|
setEnableExactlyOnceDelivery |
Habilita o inhabilita la entrega “exactamente una vez”. | verdadero o falso Predeterminado=false |
minDurationPerAckExtension |
El tiempo mínimo en segundos que se debe usar para extender el plazo límite de confirmación de la modificación. | Rango=0 a 600 Predeterminado=ninguno |
maxDurationPerAckExtension |
El tiempo máximo en segundos que se debe usar para extender el plazo límite de confirmación de la modificación. | Rango=0 a 600 Predeterminado=ninguno |
En el caso de la entrega exactamente una vez, la modifyAckDeadline
o la acknowledgment
la solicitud a Pub/Sub falla cuando el ID de confirmación ya venció. En esos casos, el servicio considera que el ID de acuse de recibo vencido no es válido, ya que es posible que una entrega más reciente ya esté en curso. Se diseñó para exactamente una vez
la entrega de software. Luego, verás que las solicitudes acknowledgment
y ModifyAckDeadline
muestran una respuesta INVALID_ARGUMENT
. Cuando se inhabilita la entrega “exactamente una vez”, estas
Las solicitudes muestran OK
en los casos de IDs de confirmación vencidos.
Para garantizar que las solicitudes de acknowledgment
y ModifyAckDeadline
tengan IDs de acuse de recibo válidos, considera establecer el valor de minDurationPerAckExtension
en un número alto.
Consideraciones regionales
La garantía de entrega exactamente una vez solo se aplica cuando los suscriptores se conectan al servicio en la misma región. Si tu aplicación suscriptora está distribuida en en varias regiones, puede dar lugar a una entrega de mensajes duplicada, incluso cuando está habilitada la entrega “exactamente una vez”. Los publicadores pueden enviar mensajes a cualquier región y se mantiene la garantía de una sola vez.
Cuando ejecutas tu aplicación en Google Cloud, esta se conecta de forma predeterminada al extremo de Pub/Sub en la misma región. Por lo tanto, Ejecutar la aplicación en una sola región dentro de Google Cloud por lo general, garantiza la interacción con una región única.
Cuando ejecutas tu aplicación de suscriptor fuera de Google Cloud o en varias regiones, puedes asegurarte de conectarte a una sola región con un extremo de ubicación cuando configures Pub/Sub cliente. Todos los extremos de ubicación para el punto de Pub/Sub a una sola ubicación regiones. Para obtener más información sobre los extremos de ubicación, consulta Extremos de Pub/Sub. Si quieres obtener una lista de todos los extremos de ubicación de Pub/Sub, consulta Lista de extremos de ubicación.
Crea suscripciones con la entrega “exactamente una vez”
Puedes crear una suscripción con entrega exactamente una vez mediante la consola de Google Cloud, Google Cloud CLI, la biblioteca cliente o la API de Pub/Sub.
Suscripción de extracción
Console
Para crear una suscripción de extracción con entrega exactamente una vez, sigue estos pasos:
En la consola de Google Cloud, ve a la página Suscripciones.
Haz clic en Crear suscripción.
Ingresa el ID de suscripción.
Elige o crea un tema desde el menú desplegable.
La suscripción recibe mensajes del tema.
En la sección Entrega “exactamente una vez”, selecciona Habilitar entrega “exactamente una vez”.
Haz clic en Crear.
gcloud
Para crear una suscripción de extracción con entrega exactamente una vez, usa el comando
gcloud pubsub subscriptions create
con la marca --enable-exactly-once-delivery
:
gcloud pubsub subscriptions create SUBSCRIPTION_ID \ --topic=TOPIC_ID \ --enable-exactly-once-delivery
Reemplaza lo siguiente:
- SUBSCRIPTION_ID: Es el ID de la suscripción que se creará.
- TOPIC_ID: Es el ID del tema para adjuntar a la suscripción.
REST
Para crear una suscripción con entrega exactamente una vez, usa el método projects.subscriptions.create
.
PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID Authorization: Bearer $(gcloud auth print-access-token)
Reemplaza lo siguiente:
- PROJECT_ID: Es el ID del proyecto para crear la suscripción.
- SUBSCRIPTION_ID: Es el ID de la suscripción que se creará.
Para crear una suscripción de extracción con entrega exactamente una vez, especifícala en el cuerpo de la solicitud:
{ "topic": "projects/PROJECT_ID/topics/TOPIC_ID", "enableExactlyOnceDelivery": true, }
Reemplaza lo siguiente:
- PROJECT_ID: el ID del proyecto con el tema
- TOPIC_ID: Es el ID del tema para adjuntar a la suscripción.
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++.
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
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.
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.
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 Pub/Sub para Python.
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.
Ruby
Antes de probar esta muestra, sigue las instrucciones de configuración de Ruby 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 Ruby.
PHP
Antes de probar esta muestra, sigue las instrucciones de configuración de PHP 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 PHP.
Suscríbete con entrega de mensajes exactamente una vez
A continuación, se incluyen algunas muestras de código para suscribirse con la entrega de exactamente una vez con la biblioteca cliente.
Suscripción de extracción
Go
Antes de probar esta muestra, sigue las instrucciones de configuración de Go que encontrarás en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la API de Go de Pub/Sub documentación de referencia.
Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Java
Antes de probar esta muestra, sigue las instrucciones de configuración de Java que encontrarás en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la API de Java de Pub/Sub documentación de referencia.
Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Node.js
Antes de probar esta muestra, sigue las instrucciones de configuración de Node.js que encontrarás en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Node.js de Pub/Sub.
Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
PHP
Antes de probar esta muestra, sigue las instrucciones de configuración de PHP que se encuentran en el Guía de inicio rápido de Pub/Sub con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de PHP de Pub/Sub.
Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Python
Antes de probar esta muestra, sigue las instrucciones de configuración de Python que encontrarás en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Python de Pub/Sub.
Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Ruby
Antes de probar esta muestra, sigue las instrucciones de configuración de Ruby que encontrarás en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Para obtener más información, consulta la API de Ruby de Pub/Sub documentación de referencia.
Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
C++
Antes de probar esta muestra, sigue las instrucciones de configuración de C++ que encontrarás en la guía de inicio rápido de Pub/Sub con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de C++ de Pub/Sub.
Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
C#
Antes de probar esta muestra, sigue las instrucciones de configuración de C# que se encuentran en el Guía de inicio rápido de Pub/Sub con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de C# de Pub/Sub.
Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Node.js (TypeScript)
Antes de probar este ejemplo, sigue las instrucciones de configuración de Node.js que se encuentran en el Guía de inicio rápido de Pub/Sub con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Pub/Sub para Node.js.
Para autenticarte en Pub/Sub, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Supervisa las suscripciones de entrega exactamente una vez
El
subscription/exactly_once_warning_count
registra la cantidad de eventos que
puede dar lugar a posibles reintentos de entregas (válidas o duplicadas). Esta métrica cuenta la
veces Pub/Sub no puede procesar las solicitudes asociadas con
IDs de confirmación de recepción (solicitud ModifyAckDeadline
o acknowledgment
). Los motivos de la falla pueden ser del servidor o del cliente. Por ejemplo, si la capa de persistencia que se usa para mantener la información de entrega de exactamente una vez no está disponible, sería un evento basado en el servidor. Si el cliente intenta confirmar la recepción de un mensaje con
un ID de confirmación no válido, sería un evento basado en el cliente.
Comprende la métrica
subscription/exactly_once_warning_count
captura eventos que pueden o no generar reenvío reales y pueden ser ruidosos según el comportamiento del cliente. Para
ejemplo: solicitudes repetidas acknowledgment
o ModifyAckDeadline
con no válidas
los IDs de confirmación aumentan la métrica repetidamente.
Las siguientes métricas también son útiles para comprender el comportamiento de los clientes:
La métrica
subscription/expired_ack_deadlines_count
muestra la cantidad de vencimientos de IDs de acuse de recibo. Confirmación Los vencimientos de los IDs pueden provocar fallas paraModifyAckDeadline
y Solicitudesacknowledgment
.La métrica
service.serviceruntime.googleapis.com/api/request_count
se puede usar para capturar fallas de solicitudes deModifyAckDeadline
oacknowledgment
en los casos en que las solicitudes llegan a Google Cloud, pero no a Pub/Sub. Hay fallas en las que esta métrica captura, por ejemplo, cuando los clientes se desconectan de Google Cloud.
En la mayoría de los casos de eventos de error que se pueden reintentar, las bibliotecas cliente compatibles reintentan la solicitud automáticamente.
Cuotas
Las suscripciones a la entrega exactamente una vez están sujetas a requisitos de cuota adicionales. Estas cuotas se aplican a lo siguiente:
- Cantidad de mensajes consumidos de suscripciones con entrega exactamente una vez habilitado por región.
- Cantidad de mensajes confirmados o cuya fecha límite se extiende cuando se usan suscripciones con entrega única exacta habilitada por región.
Para obtener más información sobre estas cuotas, consulta la tabla en la Cuotas.
Entrega “exactamente una vez” y suscripciones ordenadas
Pub/Sub admite la entrega exactamente una vez con la entrega ordenada.
Cuando se usan pedidos con entrega “exactamente una vez”, Pub/Sub espera que los reconocimientos estén en orden. Si las confirmaciones están desordenadas, el el servicio falla las solicitudes con errores temporales. Si el plazo de confirmación vence antes de que se reciba una confirmación en orden para la entrega, el cliente recibirá una reimpresión del mensaje. Debido a esto, cuando usas el ordenamiento con entrega de exactamente una vez, la capacidad de procesamiento del cliente se limita a un orden de mil mensajes por segundo.
Entregas y suscripciones de envío “exactamente una vez”
Pub/Sub admite la entrega exactamente una vez solo con suscripciones de extracción.
Los clientes que consumen mensajes de las suscripciones de envío confirman los mensajes respondiendo a las solicitudes de envío con una respuesta correcta. Sin embargo, los clientes no sabes si la suscripción a Pub/Sub recibió la respuesta y procesarlo. Esto es diferente de las suscripciones de extracción, en las que los clientes inician solicitudes de acuse de recibo y la suscripción a Pub/Sub responde si la solicitud se procesó correctamente. Por este motivo, la semántica de entrega de exactamente una vez no se alinea bien con las suscripciones push.
Qué debes saber
Si no se especifica la fecha límite de confirmación en el momento de CreateSubscription, las suscripciones habilitadas para la entrega exactamente una vez tendrán una fecha límite de confirmación predeterminada de 60 segundos.
Los plazos de acuse de recibo predeterminados más largos son beneficiosos para evitar la reenvío causada por eventos de red. Las bibliotecas cliente compatibles no usan fecha límite predeterminada de confirmación de la suscripción.
Las suscripciones con entrega exactamente una vez tienen una latencia de publicación-suscripción mucho más alta en comparación con las suscripciones normales.
Si necesitas una capacidad de procesamiento alta, tus clientes de entrega del tipo “exactamente una vez” también deben usar la extracción de transmisión.
Una suscripción podría recibir varias copias del mismo mensaje debido a duplicados en el lado de publicación, incluso con la entrega “exactamente una vez” habilitada. Los duplicados del lado de la publicación pueden deberse a varios reintentos de publicación únicos del cliente de publicación o del servicio de Pub/Sub. Si el cliente de publicación realiza varias publicaciones únicas en los reintentos, se producirán nuevas publicaciones con diferentes IDs de mensaje. Cuando el servicio de Pub/Sub realiza varias publicaciones únicas, para responder a una solicitud de publicación de un cliente, se vuelven a enviar los mensajes con los mismos IDs de mensaje.
Puedes reintentar los errores en
subscription/exactly_once_warning_count
, y las bibliotecas cliente compatibles los reintentan automáticamente. Sin embargo, no se pueden reintentar los errores relacionados con los IDs de acuse de recibo no válidos.