REL04-BP02 实施松耦合的依赖关系 - 可靠性支柱

REL04-BP02 实施松耦合的依赖关系

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

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

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

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

Diagram showing dependencies such as queuing systems and load balancers are loosely coupled

图 4:队列系统和负载均衡器等依赖关系是松耦合的。

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

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

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

常见的反面模式:

  • 部署整体式工作负载。

  • 直接在工作负载层之间调用 API,不具备失效转移或异步处理请求的功能。

  • 使用共享数据进行紧密耦合。松耦合的系统应避免通过共享数据库或其他形式的紧密耦合数据存储共享数据,这可能会重新引入紧耦合并阻碍可扩展性。

  • 忽略背压。当组件无法以相同速度处理传入数据时,您的工作负载应该能够减慢或停止传入数据。

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

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

实施指导

实施松耦合的依赖关系。可利用多种解决方案来构建松耦合的应用程序。其中包括用于实施全面托管的队列、自动化工作流、对事件的反应以及 API 等内容的服务,这些服务有助于将组件的行为相互隔离,从而提高韧性和敏捷性。

实施步骤

资源

相关文档:

相关视频: