使用 .NET 实现重试策略

在云中运行或与远程服务和资源通信的任何应用程序都必须能够处理暂时性故障。 这些应用程序经常因为网络连接瞬间断开、服务或资源繁忙时请求超时或其他因素而遇到故障。 开发人员应生成能够以透明方式处理暂时性故障的应用程序,以提高稳定性和复原能力。

本文介绍如何使用适用于 .NET 的 Azure 存储客户端库为连接到 Azure Blob 存储的应用程序设置重试策略。 重试策略定义应用程序如何处理失败的请求,并始终根据应用程序的业务要求和故障性质得到优化。

配置重试选项

Blob 存储的重试策略是以编程方式配置的,让用户可以控制如何将重试选项应用于各种服务请求和方案。 例如,基于用户交互发出请求的 Web 应用可以实现一个重试次数较少且延迟较短的策略,以提高响应能力并在出错时通知用户。 或者,在后台运行批处理请求的应用或组件可以增加重试次数,并使用指数退避策略以允许请求时间成功完成。

下表列出了 RetryOptions 类的属性,以及类型、简要说明和默认值(如果未进行更改)。 应主动优化这些属性的值,以满足应用的需求。

属性 类型​​ 说明 默认值
延迟 TimeSpan 固定方法的重试尝试之间的延迟,或基于退避的方法的计算依据的延迟。 如果服务提供了 Retry-After 响应头,则下一次重试将延迟标头值指定的持续时间。 0.8 秒
MaxDelay TimeSpan 如果服务没有提供 Retry-After 响应头,则为重试之间允许的最大延迟。 如果服务提供了 Retry-After 响应头,则下一次重试将延迟标头值指定的持续时间。 1 分钟
MaxRetries int 放弃前的最大重试尝试次数。 5(查看注释)
模式 RetryMode 用于计算重试延迟的方法。 指数
NetworkTimeout TimeSpan 应用于单个网络操作的超时。 100 秒

注意

StorageClientOptionsMaxRetries 的默认值从 3 增加到 5。 所有其他属性的默认值与 RetryOptions 相同。

在此 Blob 存储的代码示例中,我们将在 BlobClientOptions 类的 Retry 属性中配置重试选项。 然后,我们将使用重试选项为 Blob 服务创建一个客户端对象。

// 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);

在此示例中,从 BlobServiceClient 对象发出的每个服务请求将使用 BlobClientOptions 对象中定义的重试选项。 你可以根据应用的需求为服务客户端配置各种重试策略。

使用异地冗余来提高应用复原能力

如果应用需要高可用性和更高的故障复原能力,你可以利用 Azure 存储异地冗余选项作为重试策略的一部分。 为异地冗余复制配置的存储帐户将以同步方式复制到主要区域,并以异步方式复制到数百英里以外的次要区域。

Azure 存储提供两种选项用于异地冗余复制:异地冗余存储 (GRS)异地区域冗余存储 (GZRS)。 除了为存储帐户启用异地冗余之外,还需要配置对次要区域中数据的读取访问权限。 若要了解如何更改存储帐户的复制选项,请参阅更改存储帐户的复制方式

此示例将在 BlobClientOptions 中设置 GeoRedundantSecondaryUri 属性。 如果设置了此属性,则在重试期间,GETHEAD 请求将使用辅助 URI。 如果辅助 URI 的响应状态为 404,则后续重试请求时不会再次使用备辅助 URI,因为此状态代码表明资源可能尚未传播到那里。 否则,后续重试会在主要 URI 和辅助 URI 之间来回切换。

Uri secondaryAccountUri = new Uri($"https://{accountName}-secondary.blob.core.chinacloudapi.cn/");

// 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);

对于使用异地冗余的应用,需要记住一些特定的设计注意事项。 有关详细信息,请参阅使用异地冗余设计高度可用的应用程序

后续步骤

  • 本文是适用于 .NET 的 Blob 存储开发人员指南的一部分。 请参阅构建应用中的开发人员指南文章的完整列表。
  • 有关重试策略的体系结构指导和一般最佳做法,请参阅暂时性故障处理
  • 有关针对暂时性故障实现重试模式的指导,请参阅重试模式