En este documento se describe cómo habilitar los reintentos en funciones de Cloud Run basadas en eventos. La función de reintento automático no está disponible para las funciones HTTP.
Por qué no se completan las funciones basadas en eventos
En raras ocasiones, una función puede salir prematuramente debido a un error interno. De forma predeterminada, la función puede volver a intentarse automáticamente o no.
Lo más habitual es que una función basada en eventos no se complete correctamente debido a errores en el propio 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 genera una excepción.
- La función no puede acceder a un endpoint de servicio o se agota el tiempo de espera al intentar hacerlo.
- La función genera una excepción intencionadamente (por ejemplo, cuando un parámetro no supera la validación).
- Una función de Node.js devuelve una promesa rechazada o pasa un valor que no es
null
a una retrollamada.
En cualquiera de los casos anteriores, la función dejará de ejecutarse y devolverá un error. Los activadores de eventos que generan los mensajes tienen políticas de reintentos que puedes personalizar para adaptarlas a las necesidades de tu función.
Semántica de reintento
Cloud Run Functions proporciona una ejecución al menos una vez de una función basada en eventos para cada evento emitido por una fuente de eventos. La forma de configurar los reintentos depende de cómo hayas creado la función:
- Las funciones creadas en la Google Cloud consola o con la API de administrador de Cloud Run requieren que crees y gestiones los activadores de eventos por separado. Los activadores tienen comportamientos de reintento predeterminados que puedes personalizar para adaptarlos a las necesidades de tu función.
- Las funciones creadas con la API Cloud Functions v2 crearán implícitamente los activadores de eventos necesarios, como temas de Pub/Sub o activadores de Eventarc. De forma predeterminada, los reintentos están inhabilitados para estos activadores y se pueden volver a habilitar mediante la API Cloud Functions v2.
Funciones basadas en eventos creadas con Cloud Run
Las funciones creadas en la Google Cloud consola o con la API Admin de Cloud Run requieren que crees y gestiones los activadores de eventos por separado. Te recomendamos encarecidamente que revises el comportamiento predeterminado de cada tipo de activador:
- La política de reintentos de Eventarc tiene un tiempo de conservación de mensajes predeterminado de 24 horas con un retraso de espera exponencial. Consulta la documentación de Eventarc sobre reintentos de eventos.
- De forma predeterminada, Pub/Sub usa la política de reenvío inmediato para todas las suscripciones. Consulta la documentación de Pub/Sub sobre cómo gestionar fallos de mensajes y reintentar solicitudes.
Funciones basadas en eventos creadas con la API Cloud Functions v2
Las funciones creadas con la API Cloud Functions v2 (por ejemplo, con la CLI de gcloud de Cloud Functions, la API REST o Terraform) crearán y gestionarán activadores de eventos en tu nombre. De forma predeterminada, si una invocación de función finaliza con un error, la función no se vuelve a invocar y el evento se descarta. Si habilitas los reintentos en una función basada en eventos, Cloud Run Functions reintenta una invocación de función fallida hasta que se completa correctamente o hasta que caduca el periodo de reintento.
Si no se habilitan los reintentos de una función (que es el valor predeterminado), la función siempre informará de que se ha ejecutado correctamente y es posible que aparezcan códigos de respuesta 200 OK
en sus registros. Esto ocurre aunque la función haya detectado un error. Para que quede claro cuándo se produce un error en tu función, asegúrate de informar de los errores de forma adecuada.
Habilitar o inhabilitar los reintentos
Para habilitar o inhabilitar los reintentos, puedes usar Google Cloud CLI. De forma predeterminada, los reintentos están inhabilitados.
Configurar reintentos desde Google Cloud CLI
Para habilitar los reintentos con la CLI de Google Cloud, incluye la marca --retry
al desplegar la función:
gcloud functions deploy FUNCTION_NAME --retry FLAGS...
Para inhabilitar los reintentos, vuelve a desplegar la función sin la marca --retry
:
gcloud functions deploy FUNCTION_NAME FLAGS...
Periodo de reintento
Esta ventana de reintento caduca al cabo de 24 horas. Cloud Run Functions vuelve a intentar las funciones basadas en eventos recién creadas mediante una estrategia de espera exponencial, con un tiempo de espera que aumenta entre 10 y 600 segundos.Prácticas recomendadas
En esta sección se describen las prácticas recomendadas para usar reintentos.
Usar reintentos para gestionar errores transitorios
Como tu función se vuelve a intentar continuamente hasta que se ejecuta correctamente, los errores permanentes, como los errores, deben eliminarse del código mediante pruebas antes de habilitar los reintentos. Los reintentos son la mejor opción para gestionar errores intermitentes o transitorios que tienen una alta probabilidad de resolverse al volver a intentarlo, como un punto final de servicio inestable o un tiempo de espera.
Define una condición de finalización para evitar bucles de reintentos infinitos
Es una práctica recomendada proteger tu función frente a bucles continuos al usar reintentos. Para ello, incluye una condición de finalización bien definida antes de que la función empiece a procesar. Ten en cuenta que esta técnica solo funciona si tu función se inicia correctamente y puede evaluar la condición final.
Un enfoque sencillo pero eficaz es descartar los eventos con marcas de tiempo anteriores a un periodo determinado. De esta forma, se evitan ejecuciones excesivas cuando los errores son persistentes o duran más de lo esperado.
Por ejemplo, este fragmento de código descarta todos los eventos que tengan más de 10 segundos:
Node.js
Python
Go
Java
C#
Ruby
PHP
Distingue entre funciones que se pueden reintentar y errores críticos
Si tu función tiene habilitados los reintentos, cualquier error no controlado activará un reintento. Asegúrate de que tu código detecte los errores que no deberían provocar un reintento.
Node.js
Python
Go
Java
C#
Ruby
PHP
Hacer que las funciones basadas en eventos que se pueden reintentar sean idempotentes
Las funciones basadas en eventos que se pueden reintentar deben ser idempotentes. A continuación, se incluyen algunas directrices generales para que una función de este tipo sea idempotente:
- Muchas APIs 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 clave de idempotencia.
- La idempotencia funciona bien con la entrega al menos una vez, ya que permite reintentar la operación de forma segura. Por lo tanto, una práctica recomendada general para escribir código fiable es combinar la idempotencia con los reintentos.
- Asegúrate de que tu código sea idempotente internamente. Por ejemplo:
- Asegúrate de que las mutaciones puedan producirse más de una vez sin cambiar 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.
- Imponer una comprobación transaccional fuera de la función, independientemente del código. Por ejemplo, persiste el estado en algún lugar registrando que ya se ha procesado un ID de evento determinado.
- Gestionar las llamadas de funciones duplicadas fuera de banda. Por ejemplo, puedes tener un proceso de limpieza independiente que se encargue de limpiar después de las llamadas de funciones duplicadas.
Configurar la política de reintentos
En función de las necesidades de tu función de Cloud Run, puede que quieras configurar la política de reintentos directamente. De esta forma, podrás configurar cualquier combinación de las siguientes opciones:
- Acortar el periodo de reintento de 7 días a tan solo 10 minutos.
- Cambia el tiempo de espera mínimo y máximo de la estrategia de reintento de espera exponencial.
- Cambia la estrategia de reintento para que se reintente inmediatamente.
- Configura un tema de mensajes fallidos.
- Define un número máximo y mínimo de intentos de entrega.
Para configurar la política de reintentos, sigue estos pasos:
- Escribe una función HTTP.
- Usa la API de Pub/Sub para crear una suscripción de Pub/Sub y especifica la URL de la función como destino.
Consulta la documentación de Pub/Sub sobre cómo gestionar errores para obtener más información sobre cómo configurar Pub/Sub directamente.
Pasos siguientes
- Desplegar funciones de Cloud Run
- Llamar a funciones de activador de Pub/Sub
- Llamar a funciones de activación de Cloud Storage
- Tutorial de Cloud Run Functions con Pub/Sub
- Tutorial de Cloud Run Functions con Cloud Storage