En este documento, se describe cómo configurar los reintentos para las funciones de Cloud Run controladas por eventos.
Como se describe en Eventos de reintento, cuando un destino de mensaje de Pub/Sub no puede confirmar la recepción de un mensaje, la respuesta predeterminada de Pub/Sub es volver a enviar el mensaje con un retraso de retirada exponencial. Una retirada exponencial te permite agregar retrasos cada vez más largos entre los reintentos. Sin embargo, es posible que este no sea el comportamiento que deseas para tu implementación en particular.
La propiedad de reintentos no se implementa en la función en sí, sino en el activador de Eventarc que invoca la función, lo que proporciona más flexibilidad. Esto significa que, para los destinos de Cloud Run (incluidas las funciones de Cloud Run creadas con la API de Cloud Run Admin o la API de Cloud Functions v2), puedes configurar un solo intento de entrega sin reintentos. Esta es la configuración predeterminada cuando creas un activador de Eventarc en la Google Cloud consola desde la página de Cloud Run. Para obtener más información, consulta Crea activadores con Eventarc.
Por qué no se completan las funciones controladas por eventos
Es posible que una función controlada por eventos no se complete correctamente debido a errores generados en el código de la función. Estos son algunos de los motivos por los que esto podría suceder:
- La función contiene un error y el tiempo de ejecución muestra una excepción.
- La función no puede alcanzar el extremo del servicio, o el tiempo de espera se agota mientras intenta hacerlo.
- La función muestra una excepción de forma intencional (p. ej., cuando falla la validación de un parámetro).
- Una función de Node.js muestra una promesa rechazada o pasa un valor que no es
nulla una devolución de llamada. - En ocasiones poco comunes, es posible que una función se cierre de forma prematura debido a un error interno y, según la configuración predeterminada, podría volver a ejecutarse la función, automáticamente o no.
En cualquiera de estos casos, la función dejará de ejecutarse y devolverá un error. Los activadores de eventos que producen los mensajes tienen políticas de reintentos que puedes personalizar para satisfacer las necesidades de tu función.
Configura la política de reintentos
Según las necesidades de tu función de Cloud Run, es posible que desees configurar la política de reintentos a través de la política de reintentos de suscripción de Pub/Sub asociada con tu activador de Eventarc. Esto te permitirá configurar cualquier combinación de las siguientes acciones:
- Acortar el período de reintento de 7 días a tan solo 10 minutos.
- Cambiar el tiempo de retirada mínimo y máximo para la estrategia de reintento de retirada exponencial.
- Cambiar la estrategia de reintento para volver a intentar de inmediato.
- Configurar un tema de mensajes no entregados.
- Establecer una cantidad máxima y mínima de intentos de entrega.
Para configurar la política de reintentos, haz lo siguiente:
- Escribe una función de HTTP
- Usa la API de Pub/Sub para crear una suscripción de Pub/Sub y especificar la URL de la función como objetivo.
Consulta la documentación de Eventarc sobre los eventos de reintentos para obtener más prácticas recomendadas, como hacer que las funciones controladas por eventos que se pueden reintentar sean idempotentes.
Consulta la documentación de Pub/Sub sobre el manejo de fallas para obtener más información sobre cómo configurar Pub/Sub directamente.
Prácticas recomendadas
En esta sección se describen las prácticas recomendadas para usar los intentos reiterados.
Usa los intentos reiterados para administrar errores temporales
Dado que la función se vuelve a intentar de manera reiterada hasta que se ejecute correctamente, las fallas permanentes, como los errores, se deben eliminar del código mediante pruebas antes de habilitar los intentos reiterados. Lo mejor es usar estos intentos para administrar fallas intermitentes o temporales con una alta probabilidad de resolverse en un intento reiterado, como un extremo de servicio o un tiempo de espera inestables.
Configura una condición de finalización para evitar los bucles infinitos de reintentos
Se recomienda que protejas la función contra bucles continuos cuando uses los reintentos. Para esto, puedes incluir una condición de finalización bien definida antes de que la función comience a procesarse. Ten en cuenta que esta técnica solo tiene éxito si la función se inicia de manera correcta y es capaz de evaluar la condición final.
Un enfoque eficaz consiste en descartar eventos con marcas de tiempo anteriores a una hora determinada. Esto ayuda a evitar las ejecuciones excesivas cuando las fallas son persistentes o duran más de lo esperado.
Por ejemplo, este fragmento de código descarta todos los eventos que superen los 10 segundos:
Node.js
Python
Go
Java
C#
Ruby
PHP
Diferencia las funciones que se pueden reintentar de los errores no recuperables
Si tu función tiene habilitados los reintentos, cualquier error no administrado activará un reintento. Asegúrate de que tu código capture cualquier error que no debería dar como resultado un reintento.
Node.js
Python
Go
Java
C#
Ruby
PHP
Próximos pasos
- Implementa una función de Cloud Run
- Crea activadores a partir de eventos de Pub/Sub
- Crea activadores a partir de eventos de Cloud Storage
- Activa funciones desde Pub/Sub con Eventarc
- Activar funciones desde Cloud Storage con Eventarc