

# REL05-BP06 尽可能使系统为无状态
<a name="rel_mitigate_interaction_failure_stateless"></a>

 系统应该不需要状态，或者在不同的客户端请求之间卸载状态，磁盘上和内存中本地存储的数据不存在依赖关系。从而支持任意替换服务器，而且不会对可用性产生影响。

 当用户或服务与应用程序进行交互，它们通常会执行一系列交互并构成一次会话。对于用户来说，会话是他们在使用应用程序时持续存在于请求之间的特殊数据。无状态应用程序是无需掌握之前交互而且不会存储会话信息的应用程序。

 若采用无状态设计，则您可以使用无服务器计算服务，如 AWS Lambda 或 AWS Fargate。

 除了服务器替换，无状态应用程序的另一项优点是，由于任何可用的计算资源（如 EC2 实例和 AWS Lambda 函数）都可以处理任何请求，因此它们可以进行横向扩展。

 **建立此最佳实践的好处：**设计为无状态的系统更适合水平扩缩，因为可以根据流量和需求的波动情况增加或删除容量。此类系统还固有故障恢复能力，为应用程序开发提供了灵活性和敏捷性。

 **在未建立这种最佳实践的情况下暴露的风险等级：**中 

## 实施指导
<a name="implementation-guidance"></a>

 让应用程序无状态。无状态应用程序支持水平扩缩，并且可以承受单个节点故障。分析并了解在架构内维持状态的应用程序组件。这有助于您评测过渡到无状态设计的潜在影响。无状态架构会解耦用户数据并分流会话数据。这为独立扩展每个组件提供了灵活性，可以满足不同的工作负载需求，并优化资源利用率。

### 实施步骤
<a name="implementation-steps"></a>
+  确定并了解应用程序中的有状态组件。
+  将用户数据与核心应用程序逻辑分离开来进行管理，以此来解耦数据。
  +  [Amazon Cognito](https://aws.amazon.com/cognito/) 可以使用[身份池](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-identity-pools.html)、[用户池](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-started-with-cognito-user-pools.html)和 [Amazon Cognito Sync](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-sync.html) 等功能，将用户数据与应用程序代码解耦。
  +  您可以通过将密钥存储在安全的集中位置来使用 [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) 解耦用户数据。这意味着应用程序代码不需要存储密钥，这会令其更加安全。
  +  考虑采用 [Amazon S3](https://aws.amazon.com/s3/) 存储大型非结构化数据，例如图像和文档。应用程序可以在需要时检索这些数据，无需将数据存储在内存中。
  +  使用 [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) 存储用户资料等信息。您的应用程序可以近乎实时地查询这些数据。
+  将会话数据分流到数据库、缓存或外部文件。
  +  [Amazon ElastiCache](https://aws.amazon.com/elasticache/)、Amazon DynamoDB、[Amazon Elastic File System](https://aws.amazon.com/efs/)（Amazon EFS）和 [Amazon MemoryDB](https://aws.amazon.com/memorydb/) 都是可用于分流会话数据的 AWS 服务示例。
+  在确定需要将哪些状态和用户数据保留在所选存储解决方案中之后，设计无状态架构。

## 资源
<a name="resources"></a>

 **相关最佳实践：**
+  [REL11-BP03 自动修复所有层](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_withstand_component_failures_auto_healing_system.html) 

 **相关文档：**
+  [Amazon Builders' Library：避免在分布式系统中回退](https://aws.amazon.com/builders-library/avoiding-fallback-in-distributed-systems) 
+  [Amazon Builders' Library：避免无法克服的队列积压](https://aws.amazon.com/builders-library/avoiding-insurmountable-queue-backlogs) 
+  [Amazon Builders' Library：缓存挑战和策略](https://aws.amazon.com/builders-library/caching-challenges-and-strategies/) 
+  [AWS 上无状态 Web 层的最佳实践](https://docs.aws.amazon.com/whitepapers/latest/best-practices-wordpress/stateless-web-tier.html) 