使用 Python 实现重试策略

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

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

配置重试选项

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

要为客户端请求配置重试策略,可选择以下方法之一:

  • 使用默认值:适用于 Python 的 Azure 存储客户端库的默认重试策略是使用默认值的 ExponentialRetry 实例。 如果不指定重试策略,则使用默认重试策略。
  • 将值作为关键字传递给客户端构造函数:在为服务创建客户端对象时,可以将重试策略属性的值作为关键字参数传递。 此方法支持对客户端的重试策略进行自定义,在只需要配置几个选项时非常有用。
  • 创建重试策略类的实例:可以创建 ExponentialRetryLinearRetry 类的实例,并设置属性以配置重试策略。 然后,可以将实例传递给客户端构造函数,将重试策略应用到所有服务请求。

下表显示了可用于配置重试策略的所有属性。 这些属性中的任何一个都可以作为关键字传递给客户端构造函数,但有些属性只能用于 ExponentialRetryLinearRetry 实例。 表中备注了这些限制以及每个属性的默认值(如果未进行更改)。 应主动优化这些属性的值,以满足应用的需求。

属性 类型​​ 说明 默认值 ExponentialRetry LinearRetry
retry_total int 最大重试次数。 3
retry_connect int 连接重试的最大次数 3
retry_read int 读取重试的最大次数。 3
retry_status int 状态重试的最大次数 3
retry_to_secondary 布尔 是否应向辅助终结点重试该请求(如果能够)。 仅对启用了异地冗余复制的存储帐户(例如 RA-GRS 或 RA-GZRS)使用此选项。 还应确保应用能够处理可能过时的数据。 False
initial_backoff int 第一次重试的初始退避间隔(以秒为单位)。 仅适用于指数退避策略。 15 秒
increment_base int 第一次重试后,要执行 initial_backoff 递增的基数(以秒为单位)。 仅适用于指数退避策略。 3 秒
backoff int 两次重试之间的退避间隔(以秒为单位)。 仅适用于线性退避策略。 15 秒
random_jitter_range int 一个数字(以秒为单位),指示退避间隔的抖动/随机化范围。 例如,将 random_jitter_range 设置为 3 意味着退避间隔 x 可能发生变化,值介于 x+3 和 x-3 之间。 3 秒

注意

属性 retry_connectretry_readretry_status 用于对不同类型的错误进行计数。 剩余的重试计数经计算后采用以下值中的最小值retry_totalretry_connectretry_readretry_status。 因此,仅设置 retry_total 可能不起作用,除非还设置了其他属性。 在大多数情况下,可以将所有四个属性设置为相同的值,以强制执行最大重试次数。 但是,应根据应用的特定需求来优化这些属性。

以下部分演示如何使用不同的方法配置重试策略:

使用默认重试策略

适用于 Python 的 Azure 存储客户端库的默认重试策略是使用默认值的 ExponentialRetry 实例。 如果不指定重试策略,则使用默认重试策略。 还可以在为服务创建客户端对象时将任何配置属性作为关键字参数传递。

下面的代码示例演示如何在为 blob 服务创建客户端对象时将 retry_total 属性的值作为关键字参数传递。 在此示例中,客户端对象使用默认重试策略,并将 retry_total 属性和其他重试计数属性设置为 5:

# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.chinacloudapi.cn"
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)

创建 ExponentialRetry 策略

可以通过创建 ExponentialRetry 的实例并使用 retry_policy 关键字参数将该实例传递给客户端构造函数来配置重试策略。 如果需要为不同的客户端配置多个属性或多个策略,此方法会非常有用。

下面的代码示例演示如何使用 ExponentialRetry 的实例配置重试选项。 在此示例中,将 initial_backoff 设置为 10 秒,increment_base 设置为 4 秒,retry_total 设置为 3 次重试:

# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.chinacloudapi.cn"
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)

创建 LinearRetry 策略

可以通过创建 LinearRetry 实例并使用 retry_policy 关键字参数将该实例传递给客户端构造函数来配置重试策略。 如果需要为不同的客户端配置多个属性或多个策略,此方法会非常有用。

下面的代码示例演示如何使用 LinearRetry 的实例配置重试选项。 在此示例中,将 backoff 设置为 10 秒,retry_total 设置为 3 次重试,retry_to_secondary 设置为 True

# TODO: Replace <storage-account-name> with your actual storage account name
account_url = "https://<storage-account-name>.blob.core.chinacloudapi.cn"
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)

后续步骤

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