在 AWS 上设计容错且具备弹性的应用
在 AWS 上开发应用
Ricardo Sueiras
Principal Technologist
临时失败
- 了解常见失败模式:
- 临时错误会自行恢复,通常可安全重试。
超时
- 了解常见失败模式:
- 临时错误会自行恢复,通常可安全重试。
- 超时:外部服务响应过慢。
永久性错误
- 了解常见失败模式:
- 临时错误会自行恢复,通常可安全重试。
- 超时:外部服务响应过慢。
- 永久性错误:请求从根本上有问题,重试无效。
API 限制
- 了解常见失败模式:
- 临时错误会自行恢复,通常可安全重试。
- 超时:外部服务响应过慢。
- 永久性错误:请求从根本上有问题,重试无效。
- API 速率限制:请求过多,会返回 HTTP 429 Too Many Requests。
重试策略
- 分布式系统中的失败多为临时性。
- 重试请求常能成功。
- 谨慎添加重试逻辑,盲目重试会恶化问题。
- 指数退避:逐步增加重试间隔。
- 抖动:加入随机性以避免重试风暴。
- 重试上限:防止无限循环。
AWS SDK 原生能力
- AWS SDK 会自动处理重试逻辑。
- 内置重试包含指数退避与抖动。
- 失败或被限流的请求将以递增延迟重试。
- 减少您需编写的错误处理代码。
管理重试逻辑
- 重试逻辑并非总是答案。
- HTTP 4xx 错误:服务器理解但拒绝了您的请求。
- 非幂等请求:重试可能造成重复或不一致。
管理超时
- 无上限的重试会在高负载下放大问题。
- 将重试与超时结合使用。
- 超时设定等待响应的最长时间。
- 每次外部调用都应设置超时。
断路器
- 当服务持续失败,仅靠重试不够。
- 继续发请求会压垮故障服务。
- 断路器模式会暂时停止对不健康依赖的请求。
- 关闭态:请求正常流转。
断路器
- 当失败超出阈值时,断路器打开。
- 随后的请求被阻断。
断路器
- 冷却期后进入半开态以测试恢复。
- 服务成功响应:恢复正常。
- 仍在失败:断路器保持打开。
- 在应用层实现断路器。
死信队列
- 反复失败的消息会阻塞系统。
- 将其移出主处理流程。
- 失败消息进入 Dead Letter Queue。
- 构建弹性应用的关键组成。
- 但要理解权衡。
AWS API 限制
- 您通过 API 与 AWS 服务交互。
- 每个服务都有自己的 API 速率限制。
- 超限会触发限流(HTTP 429 Too Many Requests)。
- 设计应用以优雅处理限流。
集成第三方服务
- 第三方服务带来不确定性。
- 您无法控制其性能或可用性。
- 设定超时以避免长时间等待。
- 临时问题使用带退避的重试。
- 隔离依赖以降低影响范围。
集成第三方
- 考虑从同步通信转为异步。
- 即使外部服务延迟,您的系统也能继续处理。
Preparing Video For Download...