La retirada exponencial truncada es una estrategia estándar de manejo de errores para aplicaciones de red en la que el cliente vuelve a intentar de forma periódica una solicitud con errores, cada vez con más frecuencia entre las solicitudes. Los clientes deben usar la retirada exponencial truncada para los siguientes casos:
- Todas las solicitudes a Cloud Storage que muestran códigos de respuesta HTTP
5xx
y429
, incluidas las cargas y descargas de datos o metadatos - Cargas reanudables que muestran códigos de respuesta HTTP
408
- Tiempos de espera de sockets agotados y desconexiones de TCP
Comprender el funcionamiento de la retirada exponencial truncada es importante si deseas realizar lo siguiente:
Compilar aplicaciones cliente que usen directamente la API de XML o la API de JSON de Cloud Storage
Acceder a Cloud Storage a través de una biblioteca cliente. Ten en cuenta que algunas bibliotecas cliente, como la biblioteca cliente de Cloud Storage para Node.js, tienen una retirada exponencial integrada
Usar la herramienta de línea de comandos de gsutil, que tiene control de reintentos configurable
Si usas Google Cloud Console, la consola envía solicitudes a Cloud Storage y se encargará de cualquier retirada necesaria.
Algoritmo de ejemplo
Un algoritmo de retirada exponencial vuelve a intentar las solicitudes de forma exponencial, lo que aumenta el tiempo de espera entre los reintentos hasta un tiempo de retirada máximo. A continuación, se presenta un ejemplo:
Haz una solicitud a Cloud Storage.
Si la solicitud falla, espera 1 +
random_number_milliseconds
segundos y vuelve a intentar la solicitud.Si la solicitud falla, espera 2 +
random_number_milliseconds
segundos y vuelve a intentar la solicitud.Si la solicitud falla, espera 4 +
random_number_milliseconds
segundos y vuelve a intentar la solicitud.Y así sucesivamente, hasta un tiempo de
maximum_backoff
.Continúa con la espera y los reintentos hasta un número máximo de reintentos, pero no aumentes el período de espera entre los reintentos.
En el ejemplo anterior, se ilustra lo siguiente:
El tiempo de espera es min(((2^
n
) +random_number_milliseconds
),maximum_backoff
), conn
incrementado en 1 para cada iteración (solicitud).random_number_milliseconds
es una cantidad aleatoria de milésimas de segundos menor o igual que 1,000. Esto ayuda a evitar los casos en los que muchos clientes se sincronizan por alguna situación y todos realizan el reintento a la vez, lo que hace que se envíen solicitudes sincronizadas en etapas. El valor derandom_number_milliseconds
se vuelve a calcular después de cada reintento de solicitud.maximum_backoff
suele ser de 32 o 64 segundos. El valor apropiado depende del caso práctico.
Puedes continuar con los reintentos una vez que alcances el tiempo maximum_backoff
.
Después de este punto, los reintentos no necesitan continuar con el aumento del tiempo de retirada. Por ejemplo, si un cliente usa un tiempo maximum_backoff
de 64 segundos, luego de alcanzar este valor, el cliente puede volver a intentarlo cada 64 segundos. En algún momento, se debe evitar que los clientes vuelvan a intentarlo de forma ilimitada.
El tiempo que los clientes deben esperar entre los reintentos y la cantidad de reintentos que deben realizar dependen de tu caso práctico y las condiciones de la red. Por ejemplo, es posible que los clientes móviles de una aplicación deban intentar más veces y por intervalos más largos, en comparación con los clientes de escritorio de la misma aplicación.
Si las solicitudes de reintento fallan después de exceder el maximum_backoff
y cualquier tiempo adicional permitido para los reintentos, informa o registra un error mediante uno de los métodos enumerados en Asistencia y ayuda.
Implementaciones de ejemplo
Los ejemplos de retirada exponencial truncada con Cloud Storage incluyen lo siguiente:
Un ejemplo de boto para las cargas reanudables
Reintentos de solicitudes en el Servicio de transferencia de almacenamiento con Java o Python
Los ejemplos de retiradas implementadas en las bibliotecas cliente que puedes usar con Cloud Storage incluyen los siguientes:
Biblioteca de reintentos para Python
Las bibliotecas cliente de Google Cloud para Node.js pueden usar estrategias de retirada de forma automática a fin de reintentar solicitudes con el parámetro
autoRetry