Habilita los reintentos de funciones controlados por eventos
En este documento, se describe cómo habilitar los reintentos para las funciones controladas por eventos. Los reintentos automáticos no están disponibles para las funciones de HTTP.
Semántica de los reintentos
Cloud Run Functions garantiza la ejecución al menos una vez de una función controlada por eventos para cada evento emitido por una fuente de eventos. De forma predeterminada, si la invocación de una función termina con un error, esta no se vuelve a invocar y se descarta el evento. Cuando habilitas los reintentos en una función controlada por eventos, Cloud Run Functions volverá a intentar la invocación de una función con errores hasta que se complete correctamente o venza el período de reintento.
Este período de reintento vence después de 24 horas. Cloud Run Functions vuelve a intentar las funciones controladas por eventos recién creadas con una estrategia de retirada exponencial, con una retirada creciente de entre 10 y 600 segundos.Cuando los reintentos no están habilitados para una función, que es la configuración predeterminada, la función siempre informa que se ejecutó de forma correcta y pueden aparecer códigos de respuesta 200 OK
en sus registros. Esto ocurre incluso si la función encuentra un error. Para que quede claro cuando tu función encuentra un error, asegúrate de informar errores de forma adecuada.
Por qué no se completan las funciones controladas por eventos
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.
Por lo general, 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 puede ocurrir:
- 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 se agota el tiempo de espera 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
null
a una devolución de llamada.
En cualquiera de estos casos, la función deja de ejecutarse de forma predeterminada y el evento se descarta. Para volver a ejecutar la función cuando ocurre un error, puedes configurar la propiedad "reintentar en caso de error" para cambiar la política de intentos reiterados predeterminada. Esto hace que se vuelva a ejecutar el evento reiteradamente hasta que la función se complete de manera correcta o venza el tiempo de espera del reintento.
Habilita o inhabilita los reintentos
Para habilitar o inhabilitar los reintentos, puedes usar la herramienta de línea de comandos de gcloud
o la consola de Google Cloud. De forma predeterminada, los reintentos están inhabilitados.
Configura los reintentos desde la herramienta de línea de comandos de gcloud
Para habilitar los reintentos a través de la herramienta de línea de comandos de gcloud
, incluye el marcador --retry
cuando implementes tu función:
gcloud functions deploy FUNCTION_NAME --retry FLAGS...
Para inhabilitar los reintentos, vuelve a implementar la función sin la marca --retry
:
gcloud functions deploy FUNCTION_NAME FLAGS...
Configura los reintentos desde la consola
Si creas una función nueva, sigue estos pasos:
- En la pantalla Crear función, en Activador, elige el tipo de evento que actuará como activador de tu función.
- Selecciona la casilla de verificación Reintentar en caso de error para habilitar los reintentos.
Si actualizas una función existente, haz lo siguiente:
- En la página Descripción general de Cloud Run Functions, haz clic en el nombre de la función que estás actualizando para abrir la pantalla Detalles de la función y, luego, elige Editar en la barra de menú para mostrar el panel Activador.
- Selecciona o borra la casilla de verificación Reintentar en caso de error para habilitar o inhabilitar los reintentos.
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 simple y 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
Distingue entre las funciones que se pueden reintentar y los errores fatales
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
Haz idempotentes las funciones controladas por eventos que se pueden reintentar
Las funciones controladas por eventos cuya ejecución se puede reintentar deben ser idempotentes. A continuación, te mostramos algunos lineamientos generales para convertir estas funciones en idempotentes:
- Muchas API externas (como Stripe) te permiten proporcionar una clave de idempotencia como parámetro. Si usas una API de este tipo, debes usar el ID de evento como la clave de idempotencia.
- La idempotencia funciona bien con la entrega "al menos una vez", ya que permite que los intentos reiterados sean seguros. Por lo tanto, una recomendación general para escribir un código confiable es combinar la idempotencia con los intentos reiterados.
- Asegúrate de que tu código sea idempotente de forma interna. Por ejemplo:
- Asegúrate de que puedan ocurrir mutaciones más de una vez sin que cambie el resultado.
- Consulta el estado de la base de datos en una transacción antes de mutar el estado.
- Asegúrate de que todos los efectos secundarios sean idempotentes en sí.
- Debes imponer una verificación transaccional fuera de la función y que sea independiente del código. Por ejemplo, conserva el estado en algún lugar que registre si ya se procesó un ID de evento determinado.
- Administra las llamadas de función duplicadas fuera de banda. Por ejemplo, implementa un proceso de limpieza independiente que borre las llamadas de función duplicadas.
Configura la política de reintentos
Según las necesidades de tu Cloud Run Functions, puedes configurar la política de reintento directamente. 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 Pub/Sub sobre el manejo de fallas para obtener más información sobre cómo configurar Pub/Sub directamente.
Próximos pasos
- Implementación de Cloud Run Functions
- Llama a funciones del activador de Pub/Sub
- Llama a funciones de activación de Cloud Storage.
- Instructivo de Cloud Run Functions con Pub/Sub
- Instructivo de Cloud Run Functions con Cloud Storage