

# 軟體和架構
<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/))，以便能平均地使用元件，並盡量避免工作負載過度佈建。使用有效率的架構模式可盡量地讓閒置資源不會因為需求隨時間發生變化而有乏人問津的情形。 

 了解工作負載元件的要求，並採用能夠提升整體資源使用率的架構模式。淘汰不再需要的元件。 

 **實作步驟** 
+  分析工作負載需求以判斷如何回應。 
+  如果請求或作業不需要同步回應，請使用佇列驅動的架構和 Auto Scaling 工作節點，以將使用率最大化。以下是您可能會考慮使用佇列驅動架構的一些範例：     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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_tw/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) 
+  [搭配 Amazon SQS 使用 AWS Lambda](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>

 實作為客戶裝置優化的軟體模式和功能，可透過數種方式降低環境影響： 
+  實作具回溯相容性的新功能，可減少硬體更換的數量。 
+  將應用程式優化以有效執行於裝置上，有助於降低其能源耗用量及延長電池使用壽命 (若是由電池供電)。 
+  優化裝置的應用程式也可減少網路上的資料傳輸。 

 了解客戶您的架構中使用的裝置和設備、其預期生命週期，以及更換這些元件的影響。實作適當的軟體模式和功能，以盡可能減少裝置能源耗用量，以及客戶更換裝置和手動加以升級的需求。 

 **實作步驟** 
+  清查您的架構中使用的裝置。裝置可以是行動裝置、平板裝置、IOT 裝置、智慧電燈，甚或是工廠的智慧裝置。 
+  優化在裝置上執行的應用程式： 
  +  採用在背景執行任務之類的策略來降低能源耗用量。 
  +  在建置承載時考慮網路頻寬和延遲，並實施可協助應用程式在低頻寬、高延遲連結上良好運作的功能。 
  +  將承載和檔案轉換為裝置所需的優化格式。例如，您可以使用 [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/) 從遠端大規模管理連網裝置。 
+  若要測試新功能和更新，請使用具有代表性硬體集的受管 Device Farm，並迭代開發以最大化支援的裝置。如需詳細資訊，請參閱 [SUS06-BP04 使用受管 Device Farm 進行測試](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)