

# 软件和架构
<a name="a-sus-software-architecture"></a>

**Topics**
+ [SUS 3 您如何利用软件和架构模式来支持您的可持续发展目标？](sus-03.md)

# SUS 3 您如何利用软件和架构模式来支持您的可持续发展目标？
<a name="sus-03"></a>

实施用于执行负载平滑和保持已部署资源始终如一的高利用率的模式，以最大限度地减少资源消耗。由于用户行为会随着时间的推移而发生变化，因此组件可能会因缺乏使用而变得空闲。修改模式和架构以整合未充分利用的组件，从而提高整体利用率。停用不再需要的组件。了解工作负载组件的性能，并优化消耗资源最多的组件。注意客户用来访问您服务的设备，并实施相应的模式以最大限度地减少设备升级需要。 

**Topics**
+ [SUS03-BP01 针对异步和计划作业优化软件和架构](sus_sus_software_a2.md)
+ [SUS03-BP02 删除或重构很少或没有使用的工作负载组件](sus_sus_software_a3.md)
+ [SUS03-BP03 优化消耗最多时间或资源的代码区域](sus_sus_software_a4.md)
+ [SUS03-BP04 优化对设备的影响](sus_sus_software_a5.md)
+ [SUS03-BP05 使用最能支持数据访问和存储模式的软件模式和架构](sus_sus_software_a6.md)

# SUS03-BP01 针对异步和计划作业优化软件和架构
<a name="sus_sus_software_a2"></a>

使用高效的软件和架构模式（如队列驱动）来保持所部署资源的始终如一的高利用率。

 **常见反模式：** 
+  为了应对不可预见的需求高峰，您过度预置云工作负载中的资源。 
+  架构不会通过消息传递组件分离异步消息的发送方和接收方。 

 **建立此最佳实践的好处：** 
+  高效的软件和架构模式可以最大程度地减少工作负载中未使用的资源，并提高整体效率。 
+  可以独立于异步消息的接收来扩缩处理。 
+  通过消息传递组件，可以放宽可用性要求，从而能够用更少的资源来满足这些要求。 

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

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

 使用高效的架构模式（如[事件驱动型架构](https://aws.amazon.com/event-driven-architecture/)），均匀地利用组件并最大程度地减少工作负载中的过度预置。使用高效的架构模式可以最大程度地减少由于需求随时间变化而导致的闲置资源。 

 了解工作负载组件的要求，并采用可提高资源总体利用率的架构模式。停用不再需要的组件。 

 **实施步骤** 
+  分析工作负载的需求，以确定如何响应这些需求。 
+  对于不需要同步响应的请求或作业，请使用队列驱动型架构和自动扩缩工作线程来最大限度地提高利用率。以下是一些可以考虑采用队列驱动型架构的示例：     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/wellarchitected/2023-04-10/framework/sus_sus_software_a2.html)
+  对于可以随时处理的请求或作业，请使用调度机制批量处理作业以提高效率。以下是 AWS 上的调度机制的一些示例：     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/wellarchitected/2023-04-10/framework/sus_sus_software_a2.html)
+  如果在架构中使用轮询和 Webhook 机制，请将它们替换为事件。使用[事件驱动型架构](https://docs.aws.amazon.com/lambda/latest/operatorguide/event-driven-architectures.html)构建高效的工作负载。 
+  利用 [AWS 上的无服务器](https://aws.amazon.com/serverless/)来消除过量配置的基础设施。 
+  适当调整架构中各个组件的大小，以防止等待输入的闲置资源。 

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

 **相关文档：** 
+  [什么是 Amazon Simple Queue Service？](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) 
+  [什么是 Amazon MQ？](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/welcome.html) 
+  [基于 Amazon SQS 进行扩缩](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-using-sqs-queue.html) 
+  [什么是 AWS Step Functions？](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) 
+  [什么是 AWS Lambda？](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 
+  [将 AWS Lambda 与 Amazon SQS 配合使用](https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html) 
+  [什么是 Amazon EventBridge？](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html) 

 **相关视频：** 
+  [迁移到事件驱动型架构](https://www.youtube.com/watch?v=h46IquqjF3E) 

# SUS03-BP02 删除或重构很少或没有使用的工作负载组件
<a name="sus_sus_software_a3"></a>

移除未使用且不再需要的组件，并重构利用率低的组件，以最大限度减少工作负载中的浪费。

 **常见反模式：** 
+  没有定期检查工作负载的各个组件的利用率水平。 
+  没有检查和分析 AWS 合理调整大小工具（如 [AWS Compute Optimizer](https://aws.amazon.com/compute-optimizer/)）的建议。 

 **建立此最佳实践的好处：**移除未使用的组件可最大限度减少浪费并提高云工作负载的整体效率。 

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

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

 检查您的工作负载以识别空闲或未使用的组件。这是一个迭代改进过程，可以通过需求变化或新云服务的发布来触发。例如，[AWS Lambda](https://docs.aws.amazon.com/lambda/) 函数执行时间显著缩短，这可能是需要降低内存大小的指标。此外，随着 AWS 发布新的服务和功能，适用于您的工作负载的最佳服务和架构可能会发生变化。 

 持续监控工作负载活动并寻找机会来提高单个组件的利用水平。通过删除空闲组件并执行合理调整大小活动，您就可以使用最少的云资源来满足您的业务需求。 

 **实施步骤** 
+  监控和捕获工作负载关键组件的利用率指标（例如 [Amazon CloudWatch 指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/working_with_metrics.html)中的 CPU 利用率、内存利用率或网络吞吐量）。 
+  对于稳定的工作负载，定期检查 AWS 合理调整大小工具（如 [AWS Compute Optimizer](https://aws.amazon.com/compute-optimizer/)），以便识别空闲、未使用或未充分利用的组件。 
+  对于临时工作负载，请评估利用率指标以识别空闲、未使用或未充分利用的组件。 
+  停用不再需要的组件及关联资产（如 Amazon ECR 映像）。 
+  重构未充分利用的组件或将其与其他资源整合以提高利用效率。例如，您可以在单个 [Amazon RDS](https://aws.amazon.com/rds/) 数据库实例中预置多个小数据库，而不是在单个未充分利用的实例中运行数据库。 
+  了解[您的工作负载为完成一个工作单元而预置的资源](https://docs.aws.amazon.com/wellarchitected/latest/sustainability-pillar/evaluate-specific-improvements.html)。 

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

 **相关文档：** 
+ [AWS Trusted Advisor](https://aws.amazon.com/premiumsupport/technology/trusted-advisor/)
+  [什么是 Amazon CloudWatch？](https://docs.aws.amazon.com/Amazon/latest/monitoring/WhatIs.html) 
+  [自动清理 Amazon ECR 中未使用的映像](https://aws.amazon.com/blogs/compute/automated-cleanup-of-unused-images-in-amazon-ecr/) 

 **相关示例：** 
+ [Well-Architected 实验室 - 使用 AWS Compute Optimizer 合理调整大小](https://wellarchitectedlabs.com/cost/200_labs/200_aws_resource_optimization/)
+ [Well-Architected 实验室 - 优化硬件模式并遵守可持续性 KPI](https://wellarchitectedlabs.com/sustainability/200_labs/200_optimize_hardware_patterns_observe_sustainability_kpis/)

# SUS03-BP03 优化消耗最多时间或资源的代码区域
<a name="sus_sus_software_a4"></a>

优化在架构的不同组件中运行的代码，以最大限度地减少资源使用和提高性能。

 **常见反模式：** 
+  忽略为资源使用优化代码。 
+  通常通过增加资源来应对性能问题。 
+  代码审核和开发过程不会跟踪性能变化。 

 **建立此最佳实践的好处：** 使用高效的代码可以最大限度地减少资源使用量并提高性能。 

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

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

 至关重要的是检查每个功能区域（包括云架构应用程序的代码）以优化其资源使用和性能。持续监控工作负载在构建环境和生产中的性能，并确定改进资源使用率特别高的代码片段的机会。采用定期审核流程来识别代码中资源使用效率低下的错误或反模式。利用可为您的使用场景产生相同结果的简单和高效算法。 

## 实施步骤
<a name="implementation-steps"></a>
+  在开发工作负载时，采用自动化代码审核流程来提高质量并识别错误和反模式。 
  + [ 使用 Amazon CodeGuru Reviewer 自动审查代码 ](https://aws.amazon.com/blogs/devops/automate-code-reviews-with-amazon-codeguru-reviewer/)
  + [ 使用 Amazon CodeGuru 检查并发错误 ](https://aws.amazon.com/blogs/devops/detecting-concurrency-bugs-with-amazon-codeguru/)
  + [ 使用 Amazon CodeGuru 提高 Python 应用程序的代码质量 ](https://aws.amazon.com/blogs/devops/raising-code-quality-for-python-applications-using-amazon-codeguru/)
+  在运行工作负载时，监测资源以将单个工作单元的资源需求高的组件确定为代码审核目标。 
+  对于代码审核，使用代码分析器确定使用时间最长或使用资源最多的代码区域作为优化目标。 
  + [ 借助 Amazon CodeGuru Profiler 减少组织的碳排放 ](https://aws.amazon.com/blogs/devops/reducing-your-organizations-carbon-footprint-with-codeguru-profiler/)
  + [ 使用 Amazon CodeGuru Profiler 了解 Java 应用程序中的内存使用 ](https://aws.amazon.com/blogs/devops/understanding-memory-usage-in-your-java-application-with-amazon-codeguru-profiler/)
  + [ 通过 Amazon CodeGuru Profiler 改进客户体验并降低成本 ](https://aws.amazon.com/blogs/devops/improving-customer-experience-and-reducing-cost-with-codeguru-profiler/)
+  对工作负载使用最高效的操作系统和编程语言。有关节能编程语言（包括 Rust）的详细信息，请参阅 [Rust 可持续性](https://aws.amazon.com/blogs/opensource/sustainability-with-rust/)。 
+  使用可产生相同结果的更简单、更高效算法取代计算密集型算法。 
+  删除排序和格式等不必要的代码。 

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

 **相关文档：** 
+  [什么是 Amazon CodeGuru Profiler？](https://docs.aws.amazon.com/codeguru/latest/profiler-ug/what-is-codeguru-profiler.html) 
+  [FPGA 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/fpga-getting-started.html) 
+  [在 AWS 上进行构建所需工具的 AWS SDK](https://aws.amazon.com/tools/) 

 **相关视频：** 
+ [ 使用 Amazon CodeGuru Profiler 提高代码效率 ](https://www.youtube.com/watch?v=1pU4VddsBRw)
+ [ 使用 Amazon CodeGuru 自动提供代码审核和应用程序性能建议 ](https://www.youtube.com/watch?v=OD8H63C0E0I)

# SUS03-BP04 优化对设备的影响
<a name="sus_sus_software_a5"></a>

了解您的架构中使用的设备，并使用策略来减少其使用。这可以最大限度地减少云工作负载对环境的整体影响。

 **常见反模式：** 
+  忽略客户所用设备对环境的影响。 
+  手动管理和更新客户使用的资源。 

 **建立此最佳实践的好处：**实施针对客户设备优化的软件模式和功能可以减少云工作负载对环境的整体影响。 

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

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

 实施针对客户设备优化的软件模式和功能可以从几个方面减少对环境的影响。 
+  实施向后兼容的新功能可以减少硬件更换次数。 
+  优化应用程序以在设备上高效运行，这有助于降低能耗和延长电池寿命（如果它们由电池供电）。 
+  针对设备优化应用程序还可以减少网络上的数据传输。 

 了解架构中使用的设备、其预期生命周期以及更换这些组件产生的影响。实施软件模式和功能，有助于最大程度地降低设备能耗、减少客户更换设备和手动升级设备的需求。 

 **实施步骤** 
+  列出您架构中使用的设备。设备可以是移动设备、平板电脑、物联网设备、智能灯，甚至是工厂中的智能设备。 
+  优化设备上运行的应用程序： 
  +  使用策略（例如在后台运行任务）来降低能耗。 
  +  在构建有效负载时考虑网络带宽和延迟，并实施有助于您的应用程序在低带宽、高延迟链路上良好运行的功能。 
  +  将有效负载和文件转换为设备所需的优化格式。例如，您可以使用 [Amazon Elastic Transcoder](https://docs.aws.amazon.com/elastic-transcoder/) 或 [AWS Elemental MediaConvert](https://aws.amazon.com/mediaconvert/) 将大型、高质量的数字媒体文件转换为用户可以在移动设备、平板电脑、Web 浏览器和联网电视上播放的格式。 
  +  在服务器端执行计算密集型活动（例如图像渲染），或使用应用程序串流来改善旧设备上的用户体验。 
  +  对输出进行分段和分页，尤其是对于交互式会话，以管理有效负载并限制本地存储要求。 
+  使用自动化空中下载（OTA）机制将更新部署到一个或多个设备。 
  +  您可以使用 [CI/CD 管道](https://aws.amazon.com/blogs/mobile/build-a-cicd-pipeline-for-your-android-app-with-aws-services/)更新移动应用程序。 
  +  您可以使用 [AWS IoT Device Management](https://aws.amazon.com/iot-device-management/) 大规模地远程管理互联设备。 
+  要测试新功能和更新，请使用具有代表性硬件集的托管式设备场，并迭代开发以最大限度增加支持的设备数。有关更多详细信息，请参阅 [SUS06-BP04 使用托管式设备场进行测试](sus_sus_dev_a5.md)。 

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

 **相关文档：** 
+  [什么是 AWS Device Farm？](https://docs.aws.amazon.com/devicefarm/latest/developerguide/welcome.html) 
+  [Amazon AppStream 2.0 文档](https://docs.aws.amazon.com/appstream2/) 
+  [NICE DCV](https://docs.aws.amazon.com/dcv/) 
+ [在运行 FreeRTOS 的设备上更新固件的 OTA 教程](https://docs.aws.amazon.com/freertos/latest/userguide/dev-guide-ota-workflow.html)

 **相关视频：** 
+ [AWS Device Farm 简介](https://www.youtube.com/watch?v=UiJo_PEZkD4)

# SUS03-BP05 使用最能支持数据访问和存储模式的软件模式和架构
<a name="sus_sus_software_a6"></a>

了解数据在工作负载中的使用方式、用户使用数据的方式，以及数据的传输和存储方式。使用最能支持数据访问和存储的软件模式和架构，最大限度地减少支持工作负载所需的计算、网络和存储资源。

 **常见反模式：** 
+  假设所有工作负载都具有相似的数据存储和访问模式。 
+  假设所有工作负载都位于一个存储层，且只使用该存储层。 
+  假设数据访问模式会随着时间的推移保持一致。 
+  您的架构支持潜在的高数据访问突发，这会导致资源大部分时间都处于空闲状态。 

 **建立此最佳实践的好处：**根据数据访问和存储模式选择和优化架构将有助于降低开发复杂性并提高总体利用率。了解何时使用全局表、数据分区和缓存将帮助您减少运营开销，并根据您的工作负载需求进行扩展。 

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

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

 使用最符合您的数据特性和访问模式的软件和架构模式。例如，使用 [AWS 上的现代数据架构](https://aws.amazon.com/big-data/datalakes-and-analytics/modern-data-architecture/)使您可以使用为您的独特分析应用场景优化的专用服务。这些架构模式可提高数据处理效率和减少资源使用。 

 **实施步骤** 
+  分析您的数据特性和访问模式，以便确定云资源的适合配置。要考虑的关键特征包括： 
  +  **数据类型：**结构化、半结构化、非结构化 
  +  **数据增长：**有界、无界 
  +  **数据耐久性：**持久、短暂、瞬时 
  +  **访问模式：**读或写、更新频率、峰值或一致 
+  使用最能支持数据访问和存储模式的架构模式。 
  + [ 让我们来构建！ 现代数据架构 ](https://aws.amazon.com/blogs/architecture/lets-architect-modern-data-architectures/)
  + [AWS 上的数据库：根据作业选择合适工具](https://www.youtube.com/watch?v=-pb-DkD6cWg)
+  使用可以原生处理压缩数据的技术。 
+  为您架构中的数据处理使用专用[分析服务](https://aws.amazon.com/big-data/datalakes-and-analytics/?nc2=h_ql_prod_an_a)。 
+  使用最能支持您的主导查询模式的数据库引擎。管理您的数据库索引以确保高效的查询执行。有关更多详情，请参阅 [AWS 数据库](https://aws.amazon.com/products/databases/)。 
+  选择可减少架构中所用网络容量的网络协议。 

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

 **相关文档：** 
+  [Athena 压缩支持文件格式](https://docs.aws.amazon.com/athena/latest/ug/compression-formats.html) 
+  [使用 Amazon Redshift 从列数据格式复制](https://docs.aws.amazon.com/redshift/latest/dg/copy-usage_notes-copy-from-columnar.html) 
+  [在 Firehose 中转换您的输入记录格式](https://docs.aws.amazon.com/firehose/latest/dev/record-format-conversion.html) 
+  [AWS Glue 中 ETL 输入和输出的格式选项](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format.html) 
+  [通过转换为列格式提高 Amazon Athena 上的查询性能](https://docs.aws.amazon.com/athena/latest/ug/convert-to-columnar.html) 
+  [使用 Amazon Redshift 从 Amazon S3 加载压缩数据文件](https://docs.aws.amazon.com/redshift/latest/dg/t_loading-gzip-compressed-data-files-from-S3.html) 
+  [使用 Amazon Aurora 上的 Performance Insights 监视数据库负载](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights.html) 
+  [使用 Amazon RDS 上的 Performance Insights 监视数据库负载](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights.html) 
+ [Amazon S3 Intelligent-Tiering 存储类](https://aws.amazon.com/s3/storage-classes/intelligent-tiering/)

 **相关视频：** 
+ [在 AWS 上构建现代数据架构](https://www.youtube.com/watch?v=Uk2CqEt5f0o)