Implementación de una directiva de reintentos con Python
Cualquier aplicación que se ejecute en la nube o que se comunique con servicios y recursos remotos debe ser capaz de controlar errores transitorios. Es habitual que estas aplicaciones experimenten errores debido a una pérdida momentánea de conectividad de red, el agotamiento del tiempo de espera de una solicitud cuando un servicio o recurso está ocupado u otros factores. Los desarrolladores deben compilar aplicaciones que controlen los errores transitorios de forma transparente para mejorar la estabilidad y la resistencia.
En este artículo, aprenderá a usar la biblioteca cliente de Azure Storage para Python para configurar una directiva de reintento para una aplicación que se conecta a Azure Blob Storage. Las directivas de reintentos definen de qué forma la aplicación controla las solicitudes con errores y siempre se deben adaptar para que ajusten a los requisitos empresariales de la aplicación y la naturaleza del error.
Configuración de las opciones de reintento
Las directivas de reintentos para Blob Storage se configuran mediante programación, lo que ofrece control sobre cómo se aplican las opciones de reintento a varias solicitudes y escenarios de servicio. Por ejemplo, una aplicación web que emite solicitudes basadas en la interacción del usuario podría implementar una directiva con menos reintentos y retrasos más cortos para aumentar la capacidad de respuesta y notificar los errores a los usuarios. Por otro lado, una aplicación o componente que ejecuta solicitudes por lotes en segundo plano podría aumentar el número de reintentos y usar una estrategia de retroceso exponencial para permitir que la solicitud se complete correctamente.
Para configurar una directiva de reintentos para las solicitudes de cliente, puede elegir entre los métodos siguientes:
- Usar los valores predeterminados: la directiva de reintentos predeterminada para la biblioteca cliente de Azure Storage para Python es una instancia de ExponentialRetry con los valores predeterminados. Si no especifica una directiva de reintentos, se usa la directiva de reintentos predeterminada.
- Pasar valores como palabras clave al constructor del cliente: puede pasar valores para las propiedades de la directiva de reintentos como argumentos de palabra clave al crear un objeto cliente para el servicio. Este enfoque le permite personalizar la directiva de reintentos para el cliente y es útil si solo necesita configurar unas pocas opciones.
- Crear una instancia de una clase de directiva de reintentos: puede crear una instancia de la clase ExponentialRetry o LinearRetry y establecer las propiedades para configurar la directiva de reintentos. A continuación, puede pasar la instancia al constructor del cliente para aplicar la directiva de reintentos a todas las solicitudes de servicio.
En la tabla siguiente se muestran todas las propiedades que puede usar para configurar una directiva de reintentos. Cualquiera de estas propiedades se puede pasar como palabras clave al constructor del cliente, pero algunas solo están disponibles para su uso con una instancia ExponentialRetry
o LinearRetry
. Estas restricciones se indican en la tabla, junto con los valores predeterminados de cada propiedad si no realiza ningún cambio. Debe ser proactivo al ajustar los valores de estas propiedades para satisfacer las necesidades de la aplicación.
Propiedad | Tipo | Descripción | Default value | ExponentialRetry | LinearRetry |
---|---|---|---|---|---|
retry_total |
int | El número máximo de reintentos. | 3 | Sí | Sí |
retry_connect |
int | Número máximo de reintentos de conexión | 3 | Sí | Sí |
retry_read |
int | Número máximo de reintentos de lectura | 3 | Sí | Sí |
retry_status |
int | Número máximo de reintentos de estado | 3 | Sí | Sí |
retry_to_secondary |
bool | Si la solicitud se debe reintentar en el punto de conexión secundario, si es posible. Use solo esta opción para las cuentas de almacenamiento con replicación con redundancia geográfica habilitada, como RA-GRS o RA-GZRS. También debe asegurarse de que la aplicación puede controlar datos potencialmente obsoletos. | False |
Sí | Sí |
initial_backoff |
int | Intervalo de retroceso inicial (en segundos) para el primer reintento. Solo se aplica a la estrategia de retroceso exponencial. | 15 segundos | Sí | No |
increment_base |
int | Base (en segundos) para incrementar el initial_backoff después del primer reintento. Solo se aplica a la estrategia de retroceso exponencial. | 3 segundos | Sí | No |
backoff |
int | Intervalo de retroceso (en segundos) entre cada reintento. Solo se aplica a la estrategia de retroceso lineal. | 15 segundos | No | Sí |
random_jitter_range |
int | Un número (en segundos) que indica un rango de fluctuación/aleatorización para el intervalo de retroceso. Por ejemplo, establecer random_jitter_range en 3 significa que un intervalo de retroceso de x puede variar entre x+3 y x-3. |
3 segundos | Sí | Sí |
Nota:
Las propiedades retry_connect
, retry_read
y retry_status
se usan para contar diferentes tipos de errores. El número de reintentos restante se calcula como el mínimo de los siguientes valores: retry_total
, retry_connect
, retry_read
y retry_status
. Por este motivo, es posible que establecer solo retry_total
no tenga ningún efecto a menos que también establezca las otras propiedades. En la mayoría de los casos, puede establecer las cuatro propiedades en el mismo valor para aplicar un número máximo de reintentos. Sin embargo, debe ajustar estas propiedades en función de las necesidades específicas de la aplicación.
En las secciones siguientes se muestra cómo configurar una directiva de reintentos mediante diferentes enfoques:
- Usar la directiva de reintentos predeterminada
- Crear una directiva ExponentialRetry
- Crear una directiva LinearRetry
Usar la directiva de reintentos predeterminada
La directiva de reintentos predeterminada para la biblioteca cliente de Azure Storage para Python es una instancia de ExponentialRetry con los valores predeterminados. Si no especifica una directiva de reintentos, se usa la directiva de reintentos predeterminada. También puede pasar las propiedades de configuración como argumentos de palabra clave al crear un objeto cliente para el servicio.
En el ejemplo de código siguiente se muestra cómo pasar un valor para la propiedad retry_total
como argumento de palabra clave al crear un objeto de cliente para el servicio de blob. En este ejemplo, el objeto cliente usa la directiva de reintentos predeterminada con la propiedad retry_total
y otras propiedades de número de reintentos establecidas en 5:
# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()
# Create the BlobServiceClient object with retry options
blob_service_client = BlobServiceClient(account_url, credential, retry_total=5,
retry_connect=5, retry_read=5, retry_status=5)
Crear una directiva ExponentialRetry
Para configurar una directiva de reintentos, cree una instancia de ExponentialRetry y pase la instancia al constructor del cliente mediante el argumento de palabra clave retry_policy
. Este enfoque puede ser útil si necesita configurar varias propiedades o varias directivas para distintos clientes.
En el ejemplo de código siguiente se muestra cómo configurar las opciones de reintento mediante una instancia de ExponentialRetry
. En este ejemplo, establecemos initial_backoff
en 10 segundos, increment_base
en 4 segundos y retry_total
en 3 reintentos:
# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()
# Specify retry policy parameters
retry = ExponentialRetry(initial_backoff=10, increment_base=4, retry_total=3)
# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential, retry_policy=retry)
Crear una directiva LinearRetry
Para configurar una directiva de reintentos, cree una instancia de LinearRetry y pase la instancia al constructor del cliente mediante el argumento de palabra clave retry_policy
. Este enfoque puede ser útil si necesita configurar varias propiedades o varias directivas para distintos clientes.
En el ejemplo de código siguiente se muestra cómo configurar las opciones de reintento mediante una instancia de LinearRetry
. En este ejemplo, establecemos backoff
en 10 segundos, retry_total
en 3 reintentos y retry_to_secondary
en True
:
# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.windows.net"
credential = DefaultAzureCredential()
# Specify retry policy parameters
retry = LinearRetry(backoff=10, retry_total=3, retry_to_secondary=True)
# Create the BlobServiceClient object
blob_service_client = BlobServiceClient(account_url, credential, retry_policy=retry)
Pasos siguientes
- Este artículo forma parte de la guía para desarrolladores de Blob Storage para Python. Vea la lista completa de artículos de la guía para desarrolladores en Compilación de la aplicación.
- Si quiere obtener instrucciones de arquitectura y procedimientos recomendados generales para las directivas de reintento, consulte Control de errores transitorios.
- Para obtener instrucciones sobre cómo implementar un patrón de reintento para errores transitorios, consulte Patrón de reintento.