Eventarc Estándar admite la entrega de eventos al menos una vez. Esto significa que, si un destino no confirma la recepción de un evento, Eventarc intentará volver a entregarlo automáticamente.
Las características de reintento de Eventarc Estándar coinciden con las de su capa de transporte, Cloud Pub/Sub, que controla las fallas de procesamiento con una política de reintento de suscripción.
Cómo funcionan los reintentos
Cuando creas un activador de Eventarc, el tema y la suscripción de transporte de Pub/Sub se crean automáticamente para ti. (Los eventos de las fuentes de Pub/Sub pueden usar un tema de Pub/Sub existente).
Cualquier ID de suscripción creado automáticamente por Eventarc tendrá un formato que comienza con eventarc-REGION-
.
De forma predeterminada, cuando un destino no puede confirmar un mensaje, Pub/Sub 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. El retraso predeterminado comienza con un mínimo de 10 segundos y aumenta con cada falla posterior, hasta un máximo de 600 segundos. Eventarc establece la duración predeterminada de la retención de mensajes en 24 horas.
Para obtener más información sobre cómo Pub/Sub controla los reintentos, consulta Cómo controlar las fallas de los mensajes y Cómo reintentar solicitudes.
Prácticas recomendadas para controlar los reintentos
Si no se puede entregar correctamente un mensaje de evento dentro del período de retención de mensajes, se descarta, a menos que se configure un tema de mensajes no entregados. Un tema de mensajes no entregados te permite almacenar y analizar errores persistentes. En este documento, consulta Temas de mensajes no entregados.
Debido a la entrega al menos una vez, es posible que tu controlador de eventos reciba eventos duplicados. Se recomienda diseñar tus controladores para que sean idempotentes. En este documento, consulta Controladores de eventos idempotentes.
Configura reintentos
Es posible que desees personalizar el comportamiento de reintentos predeterminado. Todos los parámetros de configuración de reintentos y retención se configuran a través de la política de reintentos de la suscripción de Pub/Sub asociada con tu activador de Eventarc.
Para modificar la política de reintentos de la suscripción, primero identifica la suscripción de Pub/Sub asociada con tu activador de Eventarc. Luego, actualiza la suscripción.
Para obtener más información sobre las propiedades de suscripción, consulta Propiedades de la suscripción. Para obtener información sobre los límites de suscripción, consulta Límites de recursos de Pub/Sub.
Identifica la suscripción
Para identificar la suscripción de Pub/Sub asociada a tu activador de Eventarc, haz lo siguiente:
Console
En la consola de Google Cloud , ve a la página Activadores de Eventarc.
En la lista de activadores, haz clic en el activador cuyos detalles deseas conocer.
Haz clic en el nombre del tema.
Para mostrar el ID de suscripción, haz clic en la pestaña Suscripciones.
gcloud
Puedes usar el comando gcloud eventarc triggers describe
para recuperar el ID de suscripción.
gcloud eventarc triggers describe TRIGGER_NAME \ --location=LOCATION
Reemplaza lo siguiente:
TRIGGER_NAME
: El nombre del activador o un identificador completamente calificado.LOCATION
: la ubicación del activador de Eventarc.
Con este comando, se muestra información sobre el activador que es similar a la siguiente y que incluye el ID de suscripción:
createTime: '2023-03-16T13:40:44.889670204Z'
destination:
cloudRun:
path: /
region: us-central1
service: hello
eventDataContentType: application/protobuf
eventFilters:
...
transport:
pubsub:
subscription: projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID
topic: projects/PROJECT_ID/topics/TOPIC_ID
Terraform
Para describir un recurso de Terraform google_eventarc_trigger
, puedes usar el comando state show
.
terraform state show google_eventarc_trigger.default
El comando state show
devuelve información sobre el activador, incluido el ID de suscripción. Por ejemplo:
# google_eventarc_trigger.default:
resource "google_eventarc_trigger" "default" {
conditions = {}
create_time = "2025-07-14T17:29:22.575033822Z"
effective_labels = {
"goog-terraform-provisioned" = "true"
}
...
transport {
pubsub {
subscription = "projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID"
topic = "projects/PROJECT_ID/topics/TOPIC_ID"
}
}
}
Para obtener más información sobre el uso de Terraform, consulta la documentación de Terraform en Google Cloud .
REST
Para describir un activador en un proyecto y una ubicación determinados, usa el
método projects.locations.triggers.get
.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
TRIGGER_NAME
: el nombre del activador que deseas describir.PROJECT_ID
: ID del proyecto de Google Cloud.LOCATION
: la región en la que se crea el activador, por ejemplo,us-central1
.
Para enviar tu solicitud, expande una de estas opciones:
Si se ejecuta de forma correcta, el cuerpo de la respuesta contiene una instancia de
Trigger
similar a la siguiente:
{ "name": "projects/PROJECT_ID/locations/LOCATION/triggers/TRIGGER_NAME", "uid": "d700773a-698b-47b2-a712-2ee10b690062", "createTime": "2022-12-06T22:44:04.744001514Z", "updateTime": "2022-12-06T22:44:09.116459550Z", "eventFilters": [ { "attribute": "type", "value": "google.cloud.pubsub.topic.v1.messagePublished" } ], "serviceAccount": "SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com", "destination": { "workflow": "projects/PROJECT_ID/locations/LOCATION/workflows/WORKFLOW_NAME" }, "transport": { "pubsub": { "topic": "projects/PROJECT_ID/topics/TOPIC_ID", "subscription": "projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID" } } }
Actualiza la suscripción
Para actualizar la política de reintento de la suscripción a Pub/Sub asociada con tu activador de Eventarc, haz lo siguiente:
Console
En la consola de Google Cloud , ve a la página Activadores de Eventarc.
En la lista de activadores, haz clic en el activador cuyos detalles deseas conocer.
Haz clic en el nombre del tema.
Para mostrar el ID de suscripción, haz clic en la pestaña Suscripciones.
Haz clic en el ID de la suscripción y, luego, en
Editar.En la sección Política de reintentos, selecciona Reintentar de inmediato.
O bien, para reintentar después de un retraso de retirada exponencial, ingresa los siguientes valores en segundos:
Retirada mínima: Es la demora mínima en segundos entre las entregas consecutivas de un mensaje determinado. El valor predeterminado es de 10 segundos y debe estar entre 0 y 600.
Retirada máxima: Es la demora máxima en segundos entre las entregas consecutivas de un mensaje determinado. El valor predeterminado es 600 segundos y debe estar entre 0 y 600.
Para obtener más información, consulta la Política de reintentos.
Haz clic en Actualizar.
gcloud
Puedes usar el comando gcloud pubsub subscriptions update
para actualizar la política de reintentos de suscripción.
gcloud pubsub subscriptions update SUBSCRIPTION_ID \ --min-retry-delay=MIN_RETRY_DELAY \ --max-retry-delay=MAX_RETRY_DELAY
Reemplaza lo siguiente:
SUBSCRIPTION_ID
: Es el ID de la suscripción o un identificador completamente calificado.Se deben especificar las dos marcas siguientes para reintentar después de una demora de retroceso exponencial. De lo contrario, cualquier marca omitida volverá a su valor predeterminado:
MIN_RETRY_DELAY
: Es la demora mínima en segundos entre las entregas consecutivas de un mensaje determinado. El valor predeterminado es de 10 segundos y debe estar entre 0 y 600.MAX_RETRY_DELAY
: Es la demora máxima en segundos entre las entregas consecutivas de un mensaje determinado. El valor predeterminado es 600 segundos y debe estar entre 0 y 600.
De manera opcional, puedes usar la marca --clear-retry-policy
para borrar la política de reintentos y configurar la suscripción para que se reintente de inmediato.
Terraform
Puedes actualizar una política de reintentos de suscripción a Pub/Sub configurando el recurso de Terraform google_pubsub_subscription
. Usa el bloque import
para importar la suscripción existente de modo que Terraform pueda hacer un seguimiento del recurso en tu archivo de estado. Luego, puedes administrar el recurso importado como cualquier otro, usando ignore_changes
para especificar los atributos que Terraform debe ignorar cuando actualice el recurso.
Por ejemplo:
import { to = google_pubsub_subscription.default id = "SUBSCRIPTION_ID" } resource "google_pubsub_subscription" "default" { name = "SUBSCRIPTION_ID" topic = "TOPIC_ID" retry_policy { minimum_backoff = "MIN_RETRY_DELAYs" maximum_backoff = "MAX_RETRY_DELAYs" } lifecycle { # Ignore push delivery configuration which is managed by Eventarc ignore_changes = [push_config] } }
Reemplaza lo siguiente:
SUBSCRIPTION_ID
: Es el ID de la suscripción.TOPIC_ID
: Es el ID del tema.MIN_RETRY_DELAY
: Es la demora mínima en segundos entre las entregas consecutivas de un mensaje determinado. El valor predeterminado es de 10 segundos y debe estar entre 0 y 600.MAX_RETRY_DELAY
: Es la demora máxima en segundos entre las entregas consecutivas de un mensaje determinado. El valor predeterminado es 600 segundos y debe estar entre 0 y 600.
REST
Para actualizar la política de reintentos de una suscripción en un proyecto determinado, usa el método projects.subscriptions.patch
.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
MIN_RETRY_DELAY
: Es la demora mínima en segundos entre las entregas consecutivas de un mensaje determinado. El valor predeterminado es de 10 segundos y debe estar entre 0 y 600.MAX_RETRY_DELAY
: Es la demora máxima en segundos entre las entregas consecutivas de un mensaje determinado. El valor predeterminado es 600 segundos y debe estar entre 0 y 600.PROJECT_ID
: ID del proyecto de Google Cloud.SUBSCRIPTION_ID
: Es el ID de la suscripción a Pub/Sub que actualizas.
Cuerpo JSON de la solicitud:
{ "subscription": { "retryPolicy": { "minimumBackoff": "MIN_RETRY_DELAYs", "maximumBackoff": "MAX_RETRY_DELAYs" } }, "updateMask": "retry_policy.maximum_backoff,retry_policy.minimum_backoff" }
Para enviar tu solicitud, expande una de estas opciones:
Si se ejecuta de forma correcta, el cuerpo de la respuesta contiene una instancia de
Subscription
similar a la siguiente:
{ "name": "projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID", "topic": "projects/PROJECT_ID/topics/TOPIC_ID", ... "retryPolicy": { "minimumBackoff": "MIN_RETRY_DELAYs", "maximumBackoff": "MAX_RETRY_DELAYs" }, "state": "ACTIVE" }
Otras consideraciones sobre los reintentos
Debes tener en cuenta los siguientes factores cuando manejes errores de procesamiento o reenvíes mensajes no entregados.
Retiradas de envío
Si un suscriptor de envío envía demasiadas confirmaciones negativas, Pub/Sub puede comenzar a entregar mensajes con una retirada de envío. Cuando Pub/Sub usa una retirada de envío, deja de entregar mensajes durante un período predeterminado. Este período puede variar entre 100 milisegundos y 60 segundos. Una vez transcurrido el tiempo, Pub/Sub comienza a entregar mensajes de nuevo. Para obtener más información, consulta Retraso exponencial de reintentos de envío.
Temas de mensajes no entregados
Si el destino no recibe el mensaje, puedes reenviar los mensajes no entregados a un tema de mensajes no entregados (también conocido como la cola de mensajes no entregados). Un tema de mensajes no entregados puede almacenar mensajes que el destino no puede confirmar. Debes establecer un tema de mensajes no entregados cuando crees o actualices una suscripción de Pub/Sub, no cuando crees un tema de Pub/Sub o cuando Eventarc cree un tema de Pub/Sub. Para obtener más información, consulta Configura un tema de mensajes no entregados.
Errores que no garantizan reintentos
Cuando las aplicaciones usan Pub/Sub como la fuente del evento y dicho evento no se entrega, se vuelve a intentar el evento de forma automática, excepto los errores que no garantizan reintentos. Los eventos a un destino de Workflows desde cualquier fuente no se volverán a intentar si el flujo de trabajo no se ejecuta. Ten en cuenta que Workflows confirma los eventos apenas comienza la ejecución del flujo de trabajo. Si se inicia la ejecución del flujo de trabajo, pero luego falla, no se reintentan las ejecuciones. Para resolver estos problemas de servicio, debes manejar los errores y los reintentos dentro del flujo de trabajo.
Eventos duplicados
Los eventos duplicados pueden entregarse a los controladores de eventos. Según la
especificación de CloudEvents,
la combinación de los atributos source
y id
se considera única y,
por lo tanto, cualquier evento con la misma combinación se considera duplicado. Debes implementar controladores de eventos idempotentes como práctica recomendada general.
Controladores de eventos idempotentes
Los controladores de eventos que se pueden reintentar deben ser idempotentes con los siguientes lineamientos generales:
- Muchas APIs externas 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 reintentos 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 del servicio, sin importar el 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 duplicadas fuera de banda. Por ejemplo, implementa un proceso de limpieza independiente que borre las llamadas duplicadas.