每个模式都描述了该模式解决的问题,应用该模式的注意事项以及一个基于Microsoft Azure的示例。大多数模式都包括代码示例或代码片段,这些代码示例或代码片段显示了如何在Azure上实现该模式。但是,无论托管在Azure还是其他云平台上,大多数模式都与任何分布式系统相关。
可用性是系统正常运行的时间的一部分,通常以正常运行时间的百分比来衡量。它可能会受到系统错误,基础结构问题,恶意攻击和系统负载的影响。云应用程序通常为用户提供服务水平协议(SLA),因此必须设计应用程序以最大程度地提高可用性。
数据管理是云应用程序的关键要素,并且会影响大多数质量属性。由于诸如性能,可伸缩性或可用性之类的原因,数据通常托管在不同的位置并跨多个服务器,这可能会带来一系列挑战。例如,必须保持数据一致性,并且通常需要跨不同位置同步数据。
好的设计包括诸如组件设计和部署的一致性和连贯性,简化管理和开发的可维护性以及允许组件和子系统在其他应用程序和其他场景中使用的可重用性等因素。在设计和实施阶段做出的决定对云托管的应用程序和服务的质量和总体拥有成本产生巨大影响。
云应用程序的分布式性质需要一个消息传递基础结构,该结构最好以松散耦合的方式连接组件和服务,以最大程度地提高可伸缩性。异步消息传递被广泛使用,并提供许多好处,但同时也带来了挑战,例如消息的排序,有害消息管理,幂等等等。
云应用程序在远程数据中心中运行,在该数据中心中,您无法完全控制基础结构或某些情况下的操作系统。与本地部署相比,这会使管理和监视更加困难。应用程序必须公开运行时信息,管理员和操作员可以使用这些信息来管理和监视系统,并支持不断变化的业务需求和自定义,而无需停止或重新部署应用程序。
性能是系统在给定时间间隔内执行任何操作的响应能力的指示,而可伸缩性是系统在不影响性能的情况下处理负载增加或易于增加可用资源的能力。云应用程序通常会遇到可变的工作负载和活动高峰。尤其是在多租户情况下,几乎不可能进行预测。相反,应用程序应该能够在限制范围内扩展以满足需求的高峰,并在需求减少时进行扩展。可伸缩性不仅涉及计算实例,还涉及其他元素,例如数据存储,消息传递基础结构等等。
弹性是系统正常处理故障并从故障中恢复的能力。云托管的本质是,应用程序通常是多租户,使用共享平台服务,竞争资源和带宽,通过Internet进行通信并在商品硬件上运行,这意味着出现临时故障和更多永久性故障的可能性越来越大。检测故障并快速有效地恢复,对于保持弹性很有必要。
安全性提供了针对信息系统的恶意攻击的机密性,完整性和可用性保证(以及针对操作技术系统的攻击的安全保证)。失去这些保证可能会对您的业务运营和收入以及组织在市场中的声誉产生负面影响。维护安全性需要遵循公认的做法(安全卫生),并保持警惕以检测并快速修复漏洞和主动攻击。
创建帮助程序服务,以代表使用者服务或应用程序发送网络请求。
将后端处理与前端主机解耦,其中后端处理需要异步,但是前端仍需要明确的响应。
将应用程序的元素隔离到池中,以便如果其中一个失败,则其他元素将继续运行。
让每个服务决定何时以及如何处理业务操作,而不是依赖中央协调器。
处理连接到远程服务或资源时可能需要花费不同时间才能解决的故障。
将大消息拆分为声明检查和有效负载,以避免压倒消息总线。
撤消通过一系列步骤执行的工作,这些步骤共同定义了最终一致的操作。
使用仅追加存储记录事件的完整系列,这些事件描述了对域中数据执行的操作。
通过使用专用的主机实例来保护应用程序和服务,该主机实例充当客户端与应用程序或服务之间的代理,验证和清理请求,并在它们之间传递请求和数据。
将后端服务部署到一组地理节点中,每个地理节点都可以服务任何区域中的任何客户端请求。
在应用程序中实施功能检查,以使外部工具可以定期通过暴露的终结点访问它们。
通过选举一个实例作为负责管理其他实例的负责人,来协调分布式应用程序中一组协作任务实例所执行的操作。
如果没有为所需的查询操作理想地格式化数据,则在一个或多个数据存储中的数据上生成预填充的视图。
将执行复杂处理的任务分解为一系列可重复使用的独立元素。
对发送给服务的请求进行优先级排序,以便比具有较低优先级的请求更快地接收和处理具有较高优先级的请求。
使应用程序能够异步地向多个感兴趣的使用者通告事件,而无需将发送方耦合到接收方。
使用队列作为任务和它所调用的服务之间的缓冲区,以平滑间歇性的重负载。
通过透明地重试先前失败的操作,使应用程序在尝试连接到服务或网络资源时能够处理预期的临时故障。
跨一组分布式服务和其他远程资源协调一组操作。
以定义的顺序处理一组相关消息,而不会阻塞其他消息组的处理。
将应用程序的组件部署到单独的进程或容器中以提供隔离和封装。
将静态内容部署到基于云的存储服务,该服务可以将静态内容直接传递给客户端。
通过用新的应用程序和服务逐渐替换特定的功能,逐步迁移旧系统。
控制应用程序实例,单个租户或整个服务使用的资源消耗。
使用令牌或密钥为客户端提供对特定资源或服务的受限直接访问。