此内容已过时。此版本的架构完善的框架现在可在以下位置找到: https://docs.aws.amazon.com/zh_cn/wellarchitected/2022-03-31/framework/reliability.html

REL 5: 您如何在分布式系统中进行交互设计,从而缓解或经受住故障影响?

分布式系统依赖于通信网络以便使组件互相连接(如服务器或服务等)。尽管这些网络中存在数据丢失或延迟,但是您的工作负载必须可靠运行。分布式系统组件的运行方式不得对其他组件或工作负载产生负面影响。这些最佳实践使工作负载能够承受压力或故障,从中更快地恢复,并且降低此类伤害的影响。其结果是缩短平均恢复时间 (MTTR)。

资源

Retry, backoff, and jitter: AWS re:Invent 2019: Introducing The Amazon Builders’ Library (DOP328)
Error Retries and Exponential Backoff in AWS
Amazon API Gateway: Throttle API Requests for Better Throughput
The Amazon Builders' Library: Timeouts, retries, and backoff with jitter
The Amazon Builders' Library: Avoiding fallback in distributed systems
The Amazon Builders' Library: Avoiding insurmountable queue backlogs
The Amazon Builders' Library: Caching challenges and strategies
Well-Architected lab: Level 300: Implementing Health Checks and Managing Dependencies to Improve Reliability
CircuitBreaker (summarizes Circuit Breaker from “Release It!” book)
Michael Nygard “Release It! Design and Deploy Production-Ready Software”

最佳实践:

改进计划

实现轻松降级以将适用的硬依赖关系转换为软依赖关系

  • 实现轻松降级以将适用的硬依赖关系转换为软依赖关系: 某个组件的依赖关系运行不正常时,该组件仍可在性能降低的条件下运行。例如,当依赖关系调用失败时,进行故障转移,使用预先确定的静态响应。
  • 限制请求

  • 限制请求: 这是对按需求意外增加做出响应的缓解模式。部分请求会得到执行,但超出定义限制的请求会被拒绝,并返回说明它们已被限制的消息。客户端预期将会回退,并且放弃请求或以较低速率进行重试。
  • 控制与限制重试调用

  • 控制与限制重试调用: 在逐渐延长的间隔以后使用指数回退进行重试。引入抖动使此类重试间隔随机化,并限制重试的最大次数。
    Error Retries and Exponential Backoff in AWS
  • 快速试错和限制队列

  • 快速试错和限制队列: 如果工作负载无法成功响应请求,则快速试错。这样可释放与请求关联的资源,并允许该服务在资源不足的情况下恢复。如果工作负载能够成功响应,但请求速率过高,则使用队列来对请求进行缓冲。不过,不要允许使用长队列,它可能导致处理已被客户端放弃的过时请求。
  • 设置客户端超时

  • 为任何远程调用和大体上任何跨流程调用设置连接超时和请求超时: 许多框架具有内置超时功能,但仍需谨慎,因为许多默认值为无限值或过高。过高的值会降低超时的实用性,因为客户端等待超时发生时,系统会继续消耗资源。过低的值可能因为要重试过多请求而导致后端流量增加以及延迟变长。在有些情况下,由于要对全部请求进行重试,从而可能导致完全中断。
    AWS SDK: Retries and Timeouts
  • 尽可能使服务为无状态

  • 让应用程序无状态: 无状态应用程序支持水平扩展,并且可以承受单个节点故障。
  • 实施紧急杠杆

  • 实施紧急杠杆: 这些是可帮助您的工作负载减轻可用性影响的快速流程。即使未找到根本原因,它们也可以运行。理想的紧急杠杆可通过提供完全确定的激活与停用标准,将解析器的认知负担降低到零。杠杆示例包括,阻止所有的机器人流量或静态响应处理。杠杆通常需要手动操作,但也可实现自动化。