在 Swift 中进行重试,具有合理的默认设置和强大的灵活性。
try await retry {
try await doSomething()
}
请参阅文档,了解更高级用例的示例。
retry
函数是一个 async
函数,它会重复运行给定的 async
闭包,直到成功或失败不再可重试为止。该函数在每次尝试之间休眠,同时尊重任务取消。
该库使用与 Amazon Web Services 和 Google Cloud 类似的默认设置。
一个重要但经常被忽视的默认设置是退避算法的选择,它决定了每次尝试之间休眠的时间。 默认情况下,该库选择指数退避算法,该算法适用于大多数用例。 大多数重试用例都涉及资源(例如服务器)以及可能具有许多客户端的资源,在这些情况下,指数退避算法非常适合避免对资源进行DDoS攻击。
该 API 提供了多个自定义点,以适应任何用例
recoverFromFailure
闭包,可以有选择地为特定错误情况启用或禁用重试。 也可以通过使用 Retryable
或 NotRetryable
包装抛出的错误,有选择地为特定代码路径启用或禁用重试。RetryConfiguration
类型封装了重试行为,以便可以在多个调用站点之间重用它,而无需复制代码。Backoff
类型表示将用于确定每次尝试之间休眠时间的算法的选择。 它具有对常用算法的内置支持,但如果需要,可以使用自定义 BackoffAlgorithm
实现进行初始化。Clock
实现,以确保测试是确定性和高效的。该模块公开了一个 RetryableRequest
协议,以将安全重试方法添加到符合要求的请求类型。 协议中的重试方法类似于顶级重试函数,但更安全。 协议中的重试方法强制要求请求是幂等的,因为重试非幂等请求是不安全的。
要重试 HTTP 请求,请考虑使用 swift-http-error-handling
包,它将 RetryableRequest
一致性添加到标准 HTTPRequest
类型。