

# REL04-BP02 实施松耦合的依赖关系
<a name="rel_prevent_interaction_failure_loosely_coupled_system"></a>

 队列系统、流系统、工作流和负载均衡器等依赖关系是松耦合的。松耦合有助于隔离某个组件的行为与依赖于它的其他组件的行为，从而提升韧性和敏捷性。 

 在紧耦合的系统中，更改一个组件可能导致需要更改依赖该组件的其他组件，从而使所有组件的性能均降低。松耦合会打破这种依赖关系，使存在依赖关系的组件只需了解经过版本控制而且已发布的接口。在依赖项之间实施松耦合将隔离一个组件中的故障，防止对其他组件造成影响。 

 松耦合允许您修改代码或向组件添加功能，同时最大限度地降低依赖于该组件的其他组件的风险。它还允许在组件级别实现精细的韧性，您可以横向扩展或甚至改变依赖关系的底层实现。 

 要通过松耦合进一步提升韧性，在可能的情况下采用异步组件交互。若确定对请求进行注册已足够，则此模型适用于无需立即响应的任何交互。它包含一个生成事件的组件和另外一个使用事件的组件。两个组件不会通过直接点对点交互，但通常经由中间持久存储层集成，例如，Amazon SQS 队列或诸如 Amazon Kinesis 或 AWS Step Functions 流数据平台。 

![Diagram showing dependencies such as queuing systems and load balancers are loosely coupled](http://docs.aws.amazon.com/zh_cn/wellarchitected/2023-10-03/framework/images/loosely-coupled-dependencies.png)


 Amazon SQS 队列和 Elastic Load Balancer 只是为松耦合增加中间层的两种方式。您还可以使用 Amazon EventBridge 在 AWS Cloud 中构建事件驱动型架构，而前者可从其依赖的服务（事件使用器）中提取客户端（事件产生器）。当您需要进行高吞吐量、基于推送的多对多消息收发时，Amazon Simple Notification Service（Amazon SNS）是可供选择的高效解决方案。通过 Amazon SNS 主题，您的发布者系统可以呈扇形将消息分发到大量订阅者端点以便进行并行处理。 

 虽然队列具有多项优点，但在大多数硬性实时系统中，早于阈值时间（通常为秒）的请求应被视为过时（客户端已放弃而且不再等待响应）而不被处理。因此，较新（而且可能依然有效）的请求会被处理。 

 **预期结果：**实现松耦合的依赖关系可以最大限度地减少组件级别的故障范围，这有助于诊断和解决问题。它还简化了开发周期，允许团队在模块级别实施更改，而不会影响依赖它的其他组件的性能。这种方法能够根据资源需求以及有助于提高成本效益的组件利用率，在组件层面进行扩展。 

 **常见的反面模式：** 
+  部署整体式工作负载。 
+  直接在工作负载层之间调用 API，不具备失效转移或异步处理请求的功能。 
+  使用共享数据进行紧密耦合。松耦合的系统应避免通过共享数据库或其他形式的紧密耦合数据存储共享数据，这可能会重新引入紧耦合并阻碍可扩展性。 
+  忽略背压。当组件无法以相同速度处理传入数据时，您的工作负载应该能够减慢或停止传入数据。 

 **建立此最佳实践的好处：**松耦合有助于隔离来自其他依赖于它的组件的行为，从而提升韧性和敏捷性。组件中的故障相互隔离。 

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

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

 实施松耦合的依赖关系。可利用多种解决方案来构建松耦合的应用程序。其中包括用于实施全面托管的队列、自动化工作流、对事件的反应以及 API 等内容的服务，这些服务有助于将组件的行为相互隔离，从而提高韧性和敏捷性。 
+  **构建事件驱动型架构：**[Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 有助于您构建松耦合的分布式事件驱动型架构。 
+  **在分布式系统中实现队列：**可以使用 [ Amazon Simple Queue Service（Amazon SQS）](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) 来集成和解耦分布式系统。 
+  **将组件容器化为微服务：**利用[微服务](https://aws.amazon.com/microservices/)，团队可以构建由小型独立组件组成的应用程序，这些组件通过明确定义的 API 进行通信。[Amazon Elastic Container Service（Amazon ECS）](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html)和 [Amazon Elastic Kubernetes Service（Amazon EKS）](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html)可以帮助您更快地开始使用容器。 
+  **使用 Step Functions 管理工作流程：**[Step Functions](https://aws.amazon.com/step-functions/getting-started/) 有助于您将多种 AWS 服务协调成灵活的工作流程。 
+  **利用发布-订阅 (pub/sub) 消息架构：**[Amazon Simple Notification Service（Amazon SNS）](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)提供从发布者到订阅者（也称为产生器和使用器）的消息传输。 

### 实施步骤
<a name="implementation-steps"></a>
+  事件驱动型架构中的组件由事件启动。事件是系统中发生的操作，例如用户将商品添加到购物车。操作成功后，将生成一个激活系统的下一个组件的事件。 
  + [使用 Amazon EventBridge 构建事件驱动型应用程序](https://aws.amazon.com/blogs/compute/building-an-event-driven-application-with-amazon-eventbridge/)
  + [AWS re: Invent 2022 - 使用 Amazon EventBridge 设计事件驱动型集成](https://www.youtube.com/watch?v=W3Rh70jG-LM)
+  分布式消息系统主要有三个部分，需要为基于队列的架构实现这些部分。它们包括分布式系统的组件、用于解耦的队列（分布在 Amazon SQS 服务器上）以及队列中的消息。典型的系统有将消息发送到队列中的产生器和从队列接收消息的使用器。该队列将消息存储在多台 Amazon SQS 服务器上以实现冗余。 
  + [基本 Amazon SQS 架构](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-basic-architecture.html)
  + [使用 Amazon Simple Queue Service 在分布式应用程序之间发送消息](https://aws.amazon.com/getting-started/hands-on/send-messages-distributed-applications/)
+  由于松耦合的组件由独立团队管理，因此微服务如果得到充分利用，可以增强可维护性并提高可扩展性。它还允许在发生变化时将行为隔离到单个组件。 
  + [在 AWS 上实施微服务](https://docs.aws.amazon.com/whitepapers/latest/microservices-on-aws/microservices-on-aws.html)
  + [让我们来构造！ 使用容器构造微服务](https://aws.amazon.com/blogs/architecture/lets-architect-architecting-microservices-with-containers/)
+  借助 AWS Step Functions，您可以构建分布式应用程序、实现流程自动化、编排微服务等。将多个组件编排到一个自动化工作流程中，让您可以解耦应用程序中的依赖关系。 
  + [使用 AWS Step Functions 和 AWS Lambda 创建无服务器工作流程](https://aws.amazon.com/tutorials/create-a-serverless-workflow-step-functions-lambda/)
  + [开始使用 AWS Step Functions](https://aws.amazon.com/step-functions/getting-started/)

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

 **相关文档：** 
+  [Amazon EC2：确保幂等性](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html) 
+  [Amazon Builders' Library：分布式系统相关挑战](https://aws.amazon.com/builders-library/challenges-with-distributed-systems/) 
+  [Amazon Builders' Library：可靠性、持续工作和安然无忧](https://aws.amazon.com/builders-library/reliability-and-constant-work/) 
+  [什么是 Amazon EventBridge？](https://docs.aws.amazon.com/eventbridge/latest/userguide/what-is-amazon-eventbridge.html) 
+  [什么是 Amazon Simple Queue Service？](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) 
+ [拆分整体式应用程序](https://pages.awscloud.com/break-up-your-monolith.html)
+ [使用 AWS Step Functions 和 Amazon SQS 协调基于队列的微服务](https://aws.amazon.com/tutorials/orchestrate-microservices-with-message-queues-on-step-functions/)
+ [基本 Amazon SQS 架构](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-basic-architecture.html)
+ [基于队列的架构](https://docs.aws.amazon.com/wellarchitected/latest/high-performance-computing-lens/queue-based-architecture.html)

 **相关视频：** 
+  [2019 年 AWS 纽约峰会：介绍事件驱动型架构和 Amazon EventBridge（MAD205）](https://youtu.be/tvELVa9D9qU) 
+  [AWS re:Invent 2018：闭环系统和开放思维：如何掌控不同规模的系统（ARC337）（包括松耦合、持续工作和静态稳定性）](https://youtu.be/O8xLxNje30M) 
+  [AWS re:Invent 2019：迁移到事件驱动型架构（SVS308）](https://youtu.be/h46IquqjF3E) 
+  [AWS re:Invent 2019：使用 Amazon SQS 和 Lambda 的可扩展无服务器事件驱动型应用程序（API304）](https://youtu.be/2rikdPIFc_Q) 
+ [AWS re:Invent 2019：使用 Amazon SQS 和 Lambda 的可扩展无服务器事件驱动型应用程序](https://www.youtube.com/watch?v=2rikdPIFc_Q)
+ [AWS re: Invent 2022 - 使用 Amazon EventBridge 设计事件驱动型集成](https://www.youtube.com/watch?v=W3Rh70jG-LM)
+ [AWS re: Invent 2017：Elastic Load Balancing 深入探讨和最佳实践](https://www.youtube.com/watch?v=9TwkMMogojY)