在 AWS 上设计容错且具备弹性的应用

在 AWS 上开发应用

Ricardo Sueiras

Principal Technologist

为弹性而建

为弹性而建

在 AWS 上开发应用

一切都会失败

在 AWS 上开发应用

临时失败

 

临时性失败

  • 了解常见失败模式:
  • 临时错误会自行恢复,通常可安全重试。
在 AWS 上开发应用

超时

 

超时

  • 了解常见失败模式:
  • 临时错误会自行恢复,通常可安全重试。
  • 超时:外部服务响应过慢。
在 AWS 上开发应用

永久性错误

 

永久性错误

  • 了解常见失败模式:
  • 临时错误会自行恢复,通常可安全重试。
  • 超时:外部服务响应过慢。
  • 永久性错误:请求从根本上有问题,重试无效。
在 AWS 上开发应用

API 限制

 

API 速率限制

  • 了解常见失败模式:
  • 临时错误会自行恢复,通常可安全重试。
  • 超时:外部服务响应过慢。
  • 永久性错误:请求从根本上有问题,重试无效。
  • API 速率限制:请求过多,会返回 HTTP 429 Too Many Requests。
在 AWS 上开发应用

重试策略

  • 分布式系统中的失败多为临时性。
  • 重试请求常能成功。
  • 谨慎添加重试逻辑,盲目重试会恶化问题。
  • 指数退避:逐步增加重试间隔。
  • 抖动:加入随机性以避免重试风暴。
  • 重试上限:防止无限循环。

 

重试策略

在 AWS 上开发应用

AWS SDK 原生能力

  • AWS SDK 会自动处理重试逻辑。
  • 内置重试包含指数退避与抖动。
  • 失败或被限流的请求将以递增延迟重试。
  • 减少您需编写的错误处理代码。

 

SDK 能力

在 AWS 上开发应用

管理重试逻辑

 

不要总是重试

  • 重试逻辑并非总是答案。
  • HTTP 4xx 错误:服务器理解但拒绝了您的请求。
  • 非幂等请求:重试可能造成重复或不一致。
在 AWS 上开发应用

管理超时

 

管理超时

  • 无上限的重试会在高负载下放大问题。
  • 将重试与超时结合使用。
  • 超时设定等待响应的最长时间。
  • 每次外部调用都应设置超时。
在 AWS 上开发应用

断路器

  • 当服务持续失败,仅靠重试不够。
  • 继续发请求会压垮故障服务。
  • 断路器模式会暂时停止对不健康依赖的请求。
  • 关闭态:请求正常流转。

 

断路器

在 AWS 上开发应用

断路器

  • 当失败超出阈值时,断路器打开。
  • 随后的请求被阻断。

 

断路器

在 AWS 上开发应用

断路器

  • 冷却期后进入半开态以测试恢复。
  • 服务成功响应:恢复正常。
  • 仍在失败:断路器保持打开。
  • 在应用层实现断路器。

 

断路器

在 AWS 上开发应用

死信队列

 

死信队列

  • 反复失败的消息会阻塞系统。
  • 将其移出主处理流程。
  • 失败消息进入 Dead Letter Queue。
  • 构建弹性应用的关键组成。
  • 但要理解权衡。
在 AWS 上开发应用

AWS API 限制

 

API 限制

  • 您通过 API 与 AWS 服务交互。
  • 每个服务都有自己的 API 速率限制。
  • 超限会触发限流(HTTP 429 Too Many Requests)。
  • 设计应用以优雅处理限流。
在 AWS 上开发应用

集成第三方服务

  • 第三方服务带来不确定性。
  • 您无法控制其性能或可用性。
  • 设定超时以避免长时间等待。
  • 临时问题使用带退避的重试。
  • 隔离依赖以降低影响范围。

 

第三方集成

在 AWS 上开发应用

集成第三方

  • 考虑从同步通信转为异步。
  • 即使外部服务延迟,您的系统也能继续处理。

 

管理第三方

在 AWS 上开发应用

让我们一起练习吧!

在 AWS 上开发应用

Preparing Video For Download...