Implementación de una directiva de reintentos con .NET
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 .NET 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.
En la tabla siguiente se enumeran las propiedades de la clase RetryOptions, junto con el tipo, una breve descripción y el valor predeterminado si no se 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 | Valor predeterminado |
---|---|---|---|
Delay | TimeSpan | El retraso entre los reintentos de un enfoque fijo o el retraso en el que se basan los cálculos de un enfoque basado en retroceso. Si el servicio proporciona un encabezado de respuesta Retry-After, el reintento siguiente se retrasa durante el tiempo especificado por el valor del encabezado. | 0,8 segundos |
MaxDelay | TimeSpan | Retraso máximo permitido entre reintentos cuando el servicio no proporciona un encabezado de respuesta Retry-After. Si el servicio proporciona un encabezado de respuesta Retry-After, el reintento siguiente se retrasa durante el tiempo especificado por el valor del encabezado. | 1 minuto |
MaxRetries | int | Número máximo de reintentos antes de abandonar. | 5 |
Modo | RetryMode | Enfoque que se debe usar para calcular los retrasos de reintento. | Exponencial |
NetworkTimeout | TimeSpan | Tiempo de espera que se aplica a una operación de red individual. | 100 segundos |
En este ejemplo de código para Blob Storage, configuramos las opciones de reintento en la propiedad Retry
de la clase BlobClientOptions. Después, creamos un objeto de cliente para el servicio blob mediante las opciones de reintento.
// Provide the client configuration options for connecting to Azure Blob Storage
BlobClientOptions blobOptions = new BlobClientOptions()
{
Retry = {
Delay = TimeSpan.FromSeconds(2),
MaxRetries = 5,
Mode = RetryMode.Exponential,
MaxDelay = TimeSpan.FromSeconds(10),
NetworkTimeout = TimeSpan.FromSeconds(100)
},
};
BlobServiceClient blobServiceClient = new BlobServiceClient(
accountUri,
new DefaultAzureCredential(),
blobOptions);
En este ejemplo, cada solicitud de servicio emitida desde el objeto BlobServiceClient
usa las opciones de reintento definidas en el objeto BlobClientOptions
. Puede configurar varias estrategias de reintento para los clientes de servicio en función de las necesidades de la aplicación.
Uso de la redundancia geográfica para mejorar la resistencia de las aplicaciones
Si la aplicación requiere alta disponibilidad y una mayor resistencia frente a errores, puede aprovechar las opciones de redundancia geográfica de Azure Storage como parte de la directiva de reintentos. Las cuentas de almacenamiento configuradas para la replicación con redundancia geográfica se replican de forma sincrónica en la región primaria y se replican de forma asincrónica en una región secundaria que se encuentra a cientos de kilómetros de distancia.
Azure Storage ofrece dos opciones para la replicación con redundancia geográfica: almacenamiento con redundancia geográfica (GRS) y almacenamiento con redundancia de zona geográfica (GZRS). Además de habilitar la redundancia geográfica para la cuenta de almacenamiento, también debe configurar el acceso de lectura a los datos de la región secundaria. Para obtener información sobre cómo cambiar las opciones de replicación de la cuenta de almacenamiento, consulte Cambio de la replicación de una cuenta de almacenamiento.
En este ejemplo, establecemos la propiedad GeoRedundantSecondaryUri en BlobClientOptions
. Si se establece esta propiedad, el URI secundario se usa para GET
o HEAD
solicitudes durante los reintentos. Si el estado de la respuesta del URI secundario es un 404, los reintentos posteriores de la solicitud no vuelven a usar el URI secundario, ya que este código de estado indica que es posible que el recurso no se haya propagado todavía. De lo contrario, los reintentos posteriores se alternan entre el URI principal y el secundario.
Uri secondaryAccountUri = new Uri($"https://{accountName}-secondary.blob.core.windows.net/");
// Provide the client configuration options for connecting to Azure Blob Storage
BlobClientOptions blobOptionsGRS = new BlobClientOptions()
{
Retry = {
Delay = TimeSpan.FromSeconds(2),
MaxRetries = 5,
Mode = RetryMode.Exponential,
MaxDelay = TimeSpan.FromSeconds(10),
NetworkTimeout = TimeSpan.FromSeconds(100)
},
// Set the secondary storage URI
GeoRedundantSecondaryUri = secondaryAccountUri
};
BlobServiceClient blobServiceClient = new BlobServiceClient(
accountUri,
new DefaultAzureCredential(),
blobOptionsGRS);
En el caso de las aplicaciones que usan la redundancia geográfica, hay que tener en cuenta algunas consideraciones de diseño específicas. Para obtener más información, consulte Uso de redundancia geográfica para diseñar aplicaciones de alta disponibilidad.
Pasos siguientes
- Este artículo forma parte de la guía para desarrolladores de Blob Storage para .NET. 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.