Las fallas de publicación suelen deberse a cuellos de botella del cliente, como CPU de servicio insuficientes, mal estado del subproceso o congestión en la red. La política de reintentos del publicador define la cantidad de veces que Pub/Sub intenta entregar un mensaje y el período entre cada intento.
En este documento, se proporciona información sobre el uso de solicitudes de reintento con mensajes publicados en un tema.
Antes de comenzar
Antes de configurar el flujo de trabajo de publicación, asegúrate de haber completado las siguientes tareas:
- Obtén información sobre los temas y el flujo de trabajo de publicación.
- Crea un tema.
Roles obligatorios
Para obtener los permisos que
necesitas para reintentar las solicitudes de mensajes a un tema,
pídele a tu administrador que te otorgue el
rol de IAM Publicador de Pub/Sub (roles/pubsub.publisher) en el tema.
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
Necesitas permisos adicionales para crear o actualizar temas y suscripciones.
Acerca de las solicitudes de reintento
La configuración de reintento controla cómo las bibliotecas cliente de Pub/Sub reintentan las solicitudes de publicación. Las bibliotecas cliente tienen cualquiera de las siguientes configuraciones de reintento:
- Tiempo de espera de solicitud inicial: La cantidad de tiempo antes de que una biblioteca cliente deja de esperar a que se complete la solicitud de publicación inicial.
- Retraso de reintentos: La cantidad de tiempo que una biblioteca cliente espera para reintentar una solicitud después de que se agota el tiempo de espera de la solicitud.
- Tiempo de espera total: La cantidad de tiempo después de que una biblioteca cliente deje de reintentar las solicitudes de publicación.
Para reintentar las solicitudes de publicación, el tiempo de espera de la solicitud inicial debe ser menor que el tiempo de espera total. Por ejemplo, si usas la retirada exponencial, las bibliotecas cliente calculan el tiempo de espera de la solicitud y la demora en el reintento de la siguiente manera:
- Después de cada solicitud de publicación, el tiempo de espera de la solicitud aumenta según el multiplicador de tiempo de espera de la solicitud, hasta el tiempo máximo de espera de la solicitud.
- Después de cada reintento, la demora de reintentos aumenta según el multiplicador de demora en reintentos, hasta el retraso máximo de reintentos.
Reintenta una solicitud de mensaje
Durante el proceso de publicación, es posible que veas fallas de publicación transitorias o permanentes. En el caso de errores transitorios, por lo general, no es necesario que realices ninguna acción especial, ya que Pub/Sub reintenta los mensajes automáticamente.
También puede producirse un error cuando una operación de publicación se realiza correctamente, pero el cliente publicador no recibe la respuesta de publicación a tiempo. En este caso, también se reintenta la operación de publicación. Como resultado, puedes tener dos mensajes idénticos con diferentes IDs de mensaje.
En caso de errores persistentes, considera implementar acciones adecuadas fuera del proceso de publicación para evitar sobrecargar Pub/Sub.
Las fallas de publicación se reintentan de forma automática, excepto los errores que no garantizan reintentos. En este código de muestra, se muestra cómo crear un publicador con opciones de configuración de reintento personalizadas (ten en cuenta que no todas las bibliotecas cliente admiten la configuración de reintento personalizada; consulta la documentación de referencia de la API para el lenguaje que elegiste):
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
En el siguiente ejemplo, 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 ejemplos de código de la v1, consulta los ejemplos de código obsoletos.
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 .
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.
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 .
Reintenta solicitudes con claves de ordenamiento
Supongamos que tienes un solo cliente publicador. Usas las bibliotecas cliente de Pub/Sub para publicar los mensajes 1, 2 y 3 para la misma clave de ordenamiento A. Ahora, supongamos que el cliente publicador no recibe la respuesta publicada para el mensaje 1 antes de que venza el plazo de RPC. Se debe volver a publicar el mensaje 1. La secuencia de mensajes que recibe el cliente suscriptor se convierte en 1, 1, 2 y 3, si supones que el mensaje 2 se publica solo después de que el mensaje 1 se completa correctamente. Cada mensaje publicado tiene su propio ID de mensaje. Desde la perspectiva del cliente suscriptor, se publicaron cuatro mensajes, y los dos primeros tienen contenido idéntico.
El reintento de solicitudes de publicación con claves de ordenamiento también puede complicarse con la configuración de lotes. La biblioteca cliente agrupa los mensajes para una publicación más eficiente. Continúa con el ejemplo anterior y supón que los mensajes 1 y 2 se agrupan. Este lote se envía al servidor como una sola solicitud. Si el servidor no muestra una respuesta a tiempo, el cliente publicador reintenta este lote de dos mensajes. Por lo tanto, es posible que el cliente suscriptor reciba los mensajes 1, 2, 1, 2 y 3. Si usas una biblioteca cliente de Pub/Sub para publicar mensajes en orden y falla una operación de publicación, el servicio falla las operaciones de publicación para todos los mensajes restantes en la misma clave de ordenamiento. Luego, un cliente publicador puede decidir seguir cualquiera de las siguientes operaciones:
Volver a publicar todos los mensajes con errores en orden
Volver a publicar un subconjunto de los mensajes con errores en orden
Publicar un nuevo conjunto de mensajes
Si se produce un error que no se puede reintentar, la biblioteca cliente no publica el mensaje y deja de publicar otros mensajes con la misma clave de ordenamiento. Por ejemplo, cuando un publicador envía un mensaje a un tema que no existe, se produce un error que no se puede reintentar. Para continuar publicando mensajes con la misma clave de ordenamiento, llama a un método para reanudar la publicación y comienza a realizar publicaciones nuevamente.
En el siguiente ejemplo, se muestra cómo reanudar la publicación de mensajes con la misma clave de ordenamiento.
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
En el siguiente ejemplo, 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 ejemplos de código de la v1, consulta los ejemplos de código obsoletos.
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 .
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.
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 .
Ruby
En el siguiente ejemplo, se usa la biblioteca cliente de Pub/Sub para Ruby v3. Si aún usas la biblioteca v2, consulta la guía de migración a la v3. Para ver una lista de ejemplos de código de la v2, consulta los ejemplos de código obsoletos.
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.
¿Qué sigue?
Para obtener información sobre cómo configurar opciones de publicación avanzadas, consulta lo siguiente: