微软云设计模式——概述【转】
原文:https://docs.microsoft.com/zh-cn/azure/architecture/patterns/
这些设计模式可用于在云中构建可靠且可缩放的安全应用程序。
每种模式描述了该模式解决的问题、有关应用该模式的注意事项,以及基于 Microsoft Azure 的示例。 大多数模式都包含了代码示例或代码片段,演示如何在 Azure 中实现该模式。 但是,无论托管在 Azure 还是其他云平台中,大多数模式都与任一分布式系统相关。
云中开发的难题
可用性模式
可用性定义系统正常工作的时间所占的比例。 它会受系统错误、基础结构问题、恶意攻击和系统负载的影响。 通常通过运行时间百分比衡量。 云应用程序通常向用户提供服务级别协议 (SLA),这意味着必须以最大程度确保可用性的方式设计和实现应用程序。
模式 | 摘要 |
---|---|
运行状况终结点监视 | 在应用程序中实施可让外部工具通过公开终结点定期访问的功能检查。 |
基于队列的负载调控 | 使用队列在任务与所调用的服务之间充当缓冲,从而缓解间歇性负载过大现象。 |
限制 | 控制应用程序实例、单个租户或整个服务对资源的消耗。 |
数据管理模式
数据管理是云应用程序的关键元素,它影响着大部分质量属性。 出于性能、可伸缩性或可用性等方面的原因,数据通常托管在不同的位置并跨多个服务器,这可能会带来一系列的挑战。 例如,必须维护数据一致性,通常需要跨不同的位置同步数据。
模式 | 摘要 |
---|---|
缓存端 | 将数据按需从数据存储加载到缓存中 |
CQRS | 使用独立接口将读取数据的操作与更新数据的操作分离。 |
事件溯源 | 使用只追加存储来记录描述域中数据采取的操作的完整系列事件。 |
索引表 | 在数据存储中对查询经常引用的字段创建索引。 |
具体化视图 | 当未针对所需的查询操作完美设置数据的格式时,在一个或多个数据存储中基于数据生成预填充的视图。 |
分片 | 将数据存储划分为一组水平分区或分片。 |
静态内容托管 | 将静态内容部署到基于云的存储服务,再由后者将它们直接传送给客户端。 |
附属密钥 | 使用令牌或密钥,向客户端授予对特定资源或服务的受限直接访问权限。 |
设计和实施模式
优秀的设计包含许多要素,例如部件设计和部署中的一致性和连贯性、简化管理和开发的可维护性,以及允许部件和子系统在其他应用程序和方案中使用的可重用性。 在设计和实施阶段做出的决策对云托管应用程序和服务的质量和总拥有成本具有巨大影响。
模式 | 摘要 |
---|---|
代表 | 创建代表客户服务或应用程序发送网络请求的帮助程序服务。 |
防损层 | 在新式应用程序与旧系统之间实施外层或适配器层。 |
用于前端的后端 | 创建单独的后端服务,以供特定的前端应用程序或接口使用。 |
CQRS | 使用独立接口将读取数据的操作与更新数据的操作分离。 |
计算资源合并 | 将多个任务或操作合并到单个计算单元 |
外部配置存储 | 将配置信息从应用程序部署包移出,移到一个集中的位置。 |
网关聚合 | 使用网关可将多个单独请求聚合成一个请求。 |
网关卸载 | 将共享或专用服务功能卸载到网关代理。 |
网关路由 | 使用单个终结点将请求路由到多个服务。 |
领导选择 | 通过选拔一个实例作为领导来负责管理其他实例,协调分布式应用程序中协作性任务实例集合所执行的操作。 |
管道和筛选器 | 将一个执行复杂处理的任务分解为一系列可重复使用的单个元素。 |
Sidecar | 将应用程序的组件部署到单独的进程或容器中,以提供隔离和封装。 |
静态内容托管 | 将静态内容部署到基于云的存储服务,再由后者将它们直接传送给客户端。 |
Strangler | 通过将特定的功能片断逐渐取代为新的应用程序和服务,逐步迁移旧系统。 |
消息传送模式
云应用程序的分布性质要求消息基础结构在理想情况下能以松散耦合的方式连接组件和服务,从而将可伸缩性最大化。 异步消息受到广泛使用并提供了诸多好处,但也带来了许多挑战,如消息排序、有害消息管理和幂等性等。
模式 | 摘要 |
---|---|
竞争性使用者 | 使多个并发使用者能够处理同一消息通道上收到的消息。 |
管道和筛选器 | 将一个执行复杂处理的任务分解为一系列可重复使用的单个元素。 |
优先级队列 | 为发送到服务的请求确定优先级,以便高优先级请求能够得到比低优先级请求更快速地接收和处理。 |
Publisher-Subscriber | 使应用程序能够以异步方式向多个感兴趣的使用者公布事件,而无需将发送方与接收方耦合。 |
基于队列的负载调控 | 使用队列在任务与所调用的服务之间充当缓冲,从而缓解间歇性负载过大现象。 |
计划程序代理监督程序 | 跨一组分布式服务和其他远程资源协调一组操作。 |
管理和监视模式
云应用程序在远程数据中心内运行,在此中心内,无法完全控制基础架构,或者在某些情况下无法控制操作系统。 与本地部署相比,管理和监视难度更大。 应用程序必须公开运行时信息,以便管理员和操作员管理和监视系统,支持不断变化的业务要求和定制,而无需停止或重新部署应用程序。
模式 | 摘要 |
---|---|
代表 | 创建代表客户服务或应用程序发送网络请求的帮助程序服务。 |
防损层 | 在现代应用程序与旧系统之间实施外观或适配器层。 |
外部配置存储 | 将配置信息从应用程序部署包移出,移到一个集中的位置。 |
网关聚合 | 使用网关可将多个单独请求聚合成一个请求。 |
网关卸载 | 将共享或专用服务功能卸载到网关代理。 |
网关路由 | 使用单个终结点将请求路由到多个服务。 |
运行状况终结点监视 | 在应用程序中实施可让外部工具通过公开终结点定期访问的功能检查。 |
sidecar | 将应用程序的组件部署到单独的进程或容器中,以提供隔离和封装。 |
Strangler | 通过将特定的功能片断逐渐取代为新的应用程序和服务,逐步迁移旧系统。 |
性能和可伸缩性模式
性能是指系统在给定的时间间隔内执行任何操作的响应能力,可伸缩性则是系统能够应对负载增大且不影响性能或随时增加可用资源的能力。 云应用程序往往会遇到可变工作负载和活动高峰。 预测这些变化(尤其是在多租户方案中)几乎是不可能的。 应用程序应该能够在限制范围内扩大以满足需求高峰,并在需求减少时缩小。 可伸缩性不仅涉及计算实例,而且还涉及其他要素,例如数据存储、消息传送基础结构,等等。
模式 | 摘要 |
---|---|
缓存端 | 将数据按需从数据存储加载到缓存中 |
CQRS | 使用独立接口将读取数据的操作与更新数据的操作分离。 |
事件溯源 | 使用只追加存储来记录描述域中数据采取的操作的完整系列事件。 |
索引表 | 在数据存储中对查询经常引用的字段创建索引。 |
具体化视图 | 当未针对所需的查询操作完美设置数据的格式时,在一个或多个数据存储中基于数据生成预填充的视图。 |
优先级队列 | 为发送到服务的请求确定优先级,以便高优先级请求能够得到比低优先级请求更快速地接收和处理。 |
基于队列的负载调控 | 使用队列在任务与所调用的服务之间充当缓冲,从而缓解间歇性负载过大现象。 |
分片 | 将数据存储划分为一组水平分区或分片。 |
静态内容托管 | 将静态内容部署到基于云的存储服务,再由后者将它们直接传送给客户端。 |
限制 | 控制应用程序实例、单个租户或整个服务对资源的消耗。 |
复原模式
复原是指系统能够在发生故障后进行恰当处理,然后恢复正常。 由于云托管的性质(应用程序通常是多租户的、使用共享平台服务、争用资源和带宽、通过 Internet 通信、在市售硬件上运行),出现暂时性故障和持久性故障的可能性增大。 快速高效检测故障并恢复是保持复原能力所必需的。
模式 | 摘要 |
---|---|
隔层 | 将应用程序的元素隔离到池中,这样一来,如果一个元素出现故障,其他元素会继续工作。 |
断路器 | 连接到远程服务或资源时处理故障,此类故障所需修复时间不定。 |
补偿事务 | 撤销一系列会共同定义最终一致操作的工作。 |
运行状况终结点监视 | 在应用程序中实施可让外部工具通过公开终结点定期访问的功能检查。 |
领导选择 | 通过选拔一个实例作为领导来负责管理其他实例,协调分布式应用程序中协作性任务实例集合所执行的操作。 |
基于队列的负载调节 | 使用队列在任务与所调用的服务之间充当缓冲,从而缓解间歇性负载过大现象。 |
重试 | 当应用程序尝试连接到服务或网络资源时,使应用程序能够通过以透明方式重试先前失败的操作来处理预期的临时故障。 |
计划程序代理监督程序 | 跨一组分布式服务和其他远程资源协调一组操作。 |
安全模式
安全性是一种防止超出设计使用范围的恶意或意外操作,并防止泄露或丢失信息的系统功能。 云应用程序暴露在受信任的本地边界之外的 Internet 上,通常向公众开放,并可能为不受信任的用户提供服务。 应用程序的设计和部署必须要保护它们免受恶意攻击,仅限获得批准的用户访问,并保护敏感数据。
模式 | 摘要 |
---|---|
联合标识 | 将身份验证委托给外部标识提供者。 |
守护程序 | 通过使用专用的主机实例保护应用程序和服务,该实例用于充当客户端和应用程序或服务之间的中转站、验证和整理请求,并在它们之间传递请求和数据。 |
附属密钥 | 使用令牌或密钥,向客户端授予对特定资源或服务的受限直接访问权限。 |
模式目录
模式 | 摘要 |
---|---|
代表 | 创建代表客户服务或应用程序发送网络请求的帮助程序服务。 |
防损层 | 在新式应用程序与旧系统之间实施外层或适配器层。 |
用于前端的后端 | 创建单独的后端服务,供特定的前端应用程序或接口使用。 |
隔层 | 将应用程序的元素隔离到池中,这样,如果一个元素发生失败,其他元素可继续工作。 |
缓存端 | 将数据按需从数据存储加载到缓存中 |
断路器 | 连接到远程服务或资源时处理故障,此类故障所需修复时间不定。 |
CQRS | 使用独立接口将读取数据的操作与更新数据的操作分离。 |
补偿事务 | 撤销一系列会共同定义最终一致操作的工作。 |
竞争性使用者 | 使多个并发使用者能够处理同一消息通道上收到的消息。 |
计算资源合并 | 将多个任务或操作合并到单个计算单元 |
事件溯源 | 使用只追加存储来记录描述域中数据采取的操作的完整系列事件。 |
外部配置存储 | 将配置信息从应用程序部署包移出,移到一个集中的位置。 |
联合标识 | 将身份验证委托给外部标识提供者。 |
守护程序 | 通过使用专用的主机实例保护应用程序和服务,该实例用于充当客户端和应用程序或服务之间的中转站、验证和整理请求,并在它们之间传递请求和数据。 |
网关聚合 | 使用网关可将多个单独请求聚合成一个请求。 |
网关卸载 | 将共享或专用服务功能卸载到网关代理。 |
网关路由 | 使用单个终结点将请求路由到多个服务。 |
运行状况终结点监视 | 在应用程序中实施可让外部工具通过公开终结点定期访问的功能检查。 |
索引表 | 基于数据存储中经常由查询引用的字段创建索引。 |
领导选拔 | 通过选拔一个实例作为领导来负责管理其他实例,协调分布式应用程序中协作性任务实例集合所执行的操作。 |
具体化视图 | 当未针对所需的查询操作完美设置数据的格式时,在一个或多个数据存储中基于数据生成预填充的视图。 |
管道和筛选器 | 将一个执行复杂处理的任务分解为一系列可重复使用的单个元素。 |
优先级队列 | 为发送到服务的请求确定优先级,以便高优先级请求能够得到比低优先级请求更快速地接收和处理。 |
发布方/订阅方 | 使应用程序能够以异步方式向多个感兴趣的使用者公布事件,而无需将发送方与接收方耦合。 |
基于队列的负载调控 | 使用队列在任务与所调用的服务之间充当缓冲,从而缓解间歇性负载过大现象。 |
重试 | 当应用程序尝试连接到服务或网络资源时,使应用程序能够通过以透明方式重试先前失败的操作来处理预期的临时故障。 |
计划程序代理监督程序 | 跨一组分布式服务和其他远程资源协调一组操作。 |
分片 | 将数据存储划分为一组水平分区或分片。 |
Sidecar | 将应用程序的组件部署到单独的进程或容器中,以提供隔离和封装。 |
静态内容托管 | 将静态内容部署到基于云的存储服务,再由后者将它们直接传送给客户端。 |
Strangler | 通过将特定的功能片断逐渐取代为新的应用程序和服务,逐步迁移旧系统。 |
限制 | 控制应用程序实例、单个租户或整个服务对资源的消耗。 |
附属密钥 | 使用令牌或密钥,向客户端授予对特定资源或服务的受限直接访问权限。 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~