掌握重试机制与退避策略,提升云服务稳定性

前言

​ 在不稳定的网络环境中,如遭遇网络波动或丢包等偶发性网络问题时,重试机制是解决这类问题的有效手段。

架构

​ 我们的系统架构通常如下所示:

在这里插入图片描述

​ 请求在从Nginx到API Gateway、再到后端服务(Backend For Frontend, BFF)层,以及最终到达服务层(Service)的过程中,都可能触发重试。

重试次数

​ 在业务实践中,我们通常设定重试三次作为标准操作。

幂等

​ 由于重试可能导致同一请求被多次处理,因此下游服务必须保证幂等性,以避免产生重复或不一致的结果。

重试场景

​ 我们只在面对暂时性错误时采用重试策略,例如网络问题或服务限流等。对于如服务库存不足或用户权限不足等永久性错误,则应迅速失败(fast fail)。

重试传播

​ 重试操作应由最初触发错误的层级执行,避免重试请求向上层传播,从而引发所谓的重试风暴。首次触发重试的层应向上层返回特定的错误码,上层根据这些错误码决定是否继续重试。

退避重试
频繁的重试可能会加剧网络带宽的负担,导致资源争用。指数退避是一种通过延长每次重试间隔时间来减少重试频率的技术。

使用场景

​ 引入退避重试可能会延长服务请求的处理时间,这可能会触发上游服务的超时问题。因此,是否采用退避重试应根据具体业务场景来决定。例如,当触发下游服务的限流时,可以采用退避算法来控制发起端的流量。

Reference
  1. AWS 规范性指导 - 使用退避模式重试
  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
阿里巴巴提供的重试机制框架是 Spring Retry,它是 Spring 框架的一部分,提供了一种简单的方式来实现重试机制。Spring Retry 的主要特点包括: 1. 基于注解:Spring Retry 提供了 @Retryable 和 @Recover 两个注解,可以轻松地实现重试机制。 2. 灵活配置:Spring Retry 提供了多种配置选项,包括重试次数、重试间隔、异常类型等,可以根据需要进行灵活配置。 3. 多种重试策略:Spring Retry 提供了多种重试策略,包括简单重试、指数退避重试、随机重试等,可以根据不同的场景选择不同的策略。 4. 多种触发器:Spring Retry 提供了多种触发器,包括定时触发器、异常触发器、自定义触发器等,可以根据需要选择不同的触发器。 Spring Retry 的使用非常简单,只需要在方法上添加 @Retryable 注解并配置相关参数,即可实现重试机制。例如: ``` @Retryable(value = {RemoteAccessException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000)) public void remoteCall() { // 远程调用代码 } @Recover public void recover(RemoteAccessException e) { // 异常处理代码 } ``` 上面的代码表示在发生 RemoteAccessException 异常时最多重试 3 次,每次重试间隔为 1 秒,如果重试 3 次还是失败,则调用 recover 方法进行异常处理。 总之,Spring Retry 是一个简单而强大的重试机制框架,能够帮助开发者轻松实现重试机制,提高应用程序的可靠性和稳定性

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值