这些设计模式对于在云中构建可靠、可扩展、安全的应用程序很有用。
每个模式都描述了该模式解决的问题、应用该模式的注意事项以及一个基于 Microsoft Azure 的示例。大多数模式都包含代码示例或代码片段,它们展示了如何在 Azure 上实现该模式。但是,大多数模式都与任何分布式系统相关,无论是托管在 Azure 上还是其他云平台上。
云开发面临的挑战
数据管理
数据管理是云应用的关键要素,影响着大部分质量属性。出于性能、可扩展性或可用性等原因,数据通常托管在不同的位置并跨多个服务器,这可能会带来一系列挑战。例如,必须保持数据一致性,并且数据通常需要跨不同位置同步。
设计与实施
好的设计包括组件设计和部署的一致性和连贯性、简化管理和开发的可维护性以及允许组件和子系统在其他应用程序和其他场景中使用的可重用性等因素。在设计和实施阶段做出的决策对云托管应用程序和服务的质量和总拥有成本产生巨大影响。
消息
云应用程序的分布式特性需要一个连接组件和服务的消息传递基础架构,理想情况下以松散耦合的方式来最大化可扩展性。异步消息传递被广泛使用,并提供了许多好处,但也带来了诸如消息排序、毒消息管理、幂等性等挑战。
模式目录
模式 | 总结 | 类别 |
Ambassador | 创建代表消费者服务或应用程序发送网络请求的辅助服务。 | Design and Implementation,
|
Anti-Corruption Layer | 在现代应用程序和遗留系统之间实施外观或适配器层。 | Design and Implementation,
|
Asynchronous Request-Reply | 将后端处理与前端主机解耦,后端处理需要异步,但前端仍然需要清晰的响应。 | Messaging |
Backends for Frontends | 创建单独的后端服务以供特定前端应用程序或接口使用。 | Design and Implementation |
Bulkhead | 将应用程序的元素隔离到池中,以便如果一个失败,其他元素将继续运行。 | Reliability |
Cache-Aside | 按需将数据从数据存储加载到缓存中 | Data Management,
|
Choreography | 让每个服务决定何时以及如何处理业务操作,而不是依赖于中央协调器。 | Messaging,
|
Circuit Breaker | 处理连接到远程服务或资源时可能需要不同时间才能修复的故障。 | Reliability |
Claim Check | 将大消息拆分为声明检查和有效负载,以避免消息总线不堪重负。 | Messaging |
Compensating Transaction | 撤消由一系列步骤执行的工作,这些步骤共同定义了最终一致的操作。 | Reliability |
Competing Consumers | 允许多个并发消费者处理在同一消息传递通道上接收到的消息。 | Messaging |
Compute Resource Consolidation | 将多个任务或操作合并到一个计算单元中 | Design and Implementation |
CQRS | 使用单独的接口将读取数据的操作与更新数据的操作分开。 | Data Management,
|
Deployment Stamps | 部署应用程序组件的多个独立副本,包括数据存储。 | Reliability,
|
Event Sourcing | 使用仅附加存储来记录描述对域中数据执行的操作的完整系列事件。 | Data Management,
|
External Configuration Store | 将配置信息从应用程序部署包中移到一个集中位置。 | Design and Implementation,
|
Federated Identity | 将身份验证委托给外部身份提供者。 | Security |
Gatekeeper | 使用专用主机实例保护应用程序和服务,该主机实例充当客户端与应用程序或服务之间的代理,验证和清理请求,并在它们之间传递请求和数据。 | Security |
Gateway Aggregation | 使用网关将多个单独的请求聚合成一个请求。 | Design and Implementation,
|
Gateway Offloading | 将共享或专用服务功能卸载到网关代理。 | Design and Implementation,
|
Gateway Routing | 使用单个端点将请求路由到多个服务。 | Design and Implementation,
|
Geodes | 将后端服务部署到一组地理节点中,每个节点都可以为任何区域的任何客户端请求提供服务。 | Reliability,
|
Health Endpoint Monitoring | 在外部工具可以通过暴露的端点定期访问的应用程序中实施功能检查。 | Reliability,
|
Index Table | 在查询经常引用的数据存储中的字段上创建索引。 | Data Management,
|
Leader Election | 通过选举一个实例作为负责管理其他实例的领导者,协调分布式应用程序中一组协作任务实例执行的操作。 | Design and Implementation,
|
Materialized View | 当数据的格式不适合所需的查询操作时,生成一个或多个数据存储中数据的预填充视图。 | Data Management,
|
Pipes and Filters | 将执行复杂处理的任务分解为一系列可重复使用的独立元素。 | Design and Implementation,
|
Priority Queue | 对发送到服务的请求进行优先级排序,以便接收和处理具有较高优先级的请求比具有较低优先级的请求更快。 | Messaging,
|
Publisher/Subscriber | 使应用程序能够异步向多个感兴趣的消费者宣布事件,而无需将发送者与接收者耦合。 | Messaging |
Queue-Based Load Leveling | 使用队列作为任务和它调用的服务之间的缓冲区,以平滑间歇性重负载。 | Reliability,
|
Retry | 通过透明地重试以前失败的操作,使应用程序能够在尝试连接到服务或网络资源时处理预期的临时故障。 | Reliability |
Scheduler Agent Supervisor | 跨一组分布式服务和其他远程资源协调一组操作。 | Messaging,
|
Sequential Convoy | 以定义的顺序处理一组相关的消息,而不阻塞其他组消息的处理。 | Messaging |
Sharding | 将数据存储划分为一组水平分区或分片。 | Data Management,
|
Sidecar | 将应用程序的组件部署到单独的进程或容器中,以提供隔离和封装。 | Design and Implementation,
|
Static Content Hosting | 将静态内容部署到基于云的存储服务,该服务可以将它们直接交付给客户端。 | Design and Implementation,
|
Strangler Fig | 通过逐渐用新的应用程序和服务替换特定的功能,逐步迁移遗留系统。 | Design and Implementation,
|
Throttling | 控制应用程序实例、单个租户或整个服务使用的资源消耗。 | Reliability,
|
Valet Key | 使用为客户端提供对特定资源或服务的受限直接访问的令牌或密钥。 | Data Management,
|