18 个不稳定版本 (4 个破坏性版本)
新 0.5.0 | 2024 年 8 月 20 日 |
---|---|
0.4.1 | 2024 年 4 月 29 日 |
0.4.0 | 2024 年 1 月 8 日 |
0.3.2 | 2023 年 12 月 4 日 |
0.1.1 | 2023 年 7 月 27 日 |
#226 在 异步
每月 148 次下载
用于 3 crates
10MB
1K SLoC
keen-retry
介绍
keen-retry
crate 是一个为 Rust 应用程序提供零成本、灵活且强大的重试逻辑实现方式,同时支持向库中添加容错性。无论您是开发 API、高性能系统、分布式应用程序还是简单的工具,keen-retry
都提供了一套全面的特性,以优雅地处理暂时性故障,确保您的应用程序保持弹性、可靠,并能提供丰富的诊断信息,这对于解决故障的根本原因至关重要。
特性
- 零成本抽象:利用 Rust 强大的类型系统和编译时优化,以无运行时开销的方式提供重试功能。
- 清晰的错误区分:由于非暂时性错误而重试操作是徒劳的,会浪费资源并可能损害应用程序性能。
- 仪表化和日志记录:全面的日志记录和仪表化特性,用于观察和调试重试操作。
- 可组合的重试逻辑:易于链式和可组合的重试操作,允许编写清晰且易于维护的代码。
- Async/Await 支持:对异步编程的第一类支持,与 Tokio 和其他异步运行时兼容。
- 灵活的重试退避策略:包括从简单的恒定延迟到复杂的带有抖动的指数退避策略,适用于不同的场景和需求。
快速入门
集成您的库/API
第一步是将您的库或 API 中每个可重试的操作返回丰富的 RetryResult
类型,该类型清楚地区分了 Ok
、Fatal
和 Transient
变体
/// Wrapper around [Self::connect_to_server_raw()], enabling `keen-retry` on it
pub async fn connect_to_server(&self) -> RetryProcedureResult<ConnectionErrors> {
self.connect_to_server_raw().await
.map_or_else(|error| match error.is_fatal() {
true => RetryResult::Fatal { input: (), error },
false => RetryResult::Transient { input: (), error },
},
|_| RetryResult::Ok { reported_input: (), output: () })
}
用法
现在,在应用程序中,您可以通过零成本的函数式 API 使用它
let resolved = connect_to_server()
.retry_with(|_| connect_to_server())
.<one-of-the-backoff-strategies>(...)
.<instrumentation-facilities>(...)
.<mapping-of-outputs-and-errors>(...);
keen-retry
图
如需了解更多详情,请参阅 tests/use_cases.rs
,其中包含高级演示,例如如何添加完整的仪器化(如在生产应用中看到的那样)、如何组合嵌套的重试逻辑以及如何实现通用的“部分完成带延续闭包”设计模式。
性能分析
keen-retry
经过严格基准测试以确保其遵循零成本抽象原则,这对于系统编程至关重要。我们的基准测试可在 benches/zero_cost_abstractions.rs
找到,展示了该包的效率。
书籍
要深入了解适用于 keen-retry
的设计模式、原则、策略和最佳实践,请务必探索我们的配套 keen-retry crate 的书籍,该书籍作为 definitive guide,提供洞察力和实际示例,以充分利用 keen-retry
在各种软件开发场景中的全部潜力。