架构风格是一系列具有某些共同特征的架构。例如,n层是一种常见的体系结构样式。最近,微服务体系结构开始受到青睐。架构风格不需要使用特定的技术,但是有些技术非常适合特定的架构。例如,容器自然适合于微服务。
我们已经确定了一组在云应用程序中常见的体系结构样式。每种风格的文章包括:
- 样式的描述和逻辑关系图。
- 建议何时选择这种风格。
- 好处、挑战和最佳实践。
- 推荐使用相关Azure服务进行部署。
快速浏览一下这些风格
本节将快速介绍我们已经确定的体系结构样式,以及使用它们的一些高级注意事项。阅读相关主题的更多细节。
n层
n层是企业应用程序的传统体系结构。依赖项是通过将应用程序划分为执行逻辑功能(如表示、业务逻辑和数据访问)的层来管理的。一个层只能调用它下面的层。然而,这种水平分层可能是一种不利因素。在不触及应用程序其余部分的情况下,在应用程序的一部分中引入更改是很困难的。这使得频繁的更新成为一个挑战,限制了新功能添加的速度。
N-tier非常适合迁移已经使用分层架构的现有应用程序。由于这个原因,n层最常出现在基础设施即服务(IaaS)解决方案中,或使用IaaS和托管服务组合的应用程序中。
Web-Queue-Worker
对于纯粹的PaaS解决方案,可以考虑web队列工作人员体系结构。在这种风格中,应用程序有一个处理HTTP请求的web前端和一个执行cpu密集型任务或长时间运行操作的后端工作者。前端通过异步消息队列与工作人员通信。
Web-queue-worker适用于一些相对简单的域,这些域具有一些资源密集型任务。与n层一样,体系结构很容易理解。托管服务的使用简化了部署和操作。但是对于复杂的域,可能很难管理依赖关系。前端和工作人员很容易变成大型的、难以维护和更新的单片组件。与N-tier一样,这可以减少更新频率并限制创新。
Microservices
如果您的应用程序具有更复杂的域,则考虑迁移到微服务体系结构。微服务应用程序由许多小型的独立服务组成。每个服务实现单个业务功能。服务是松散耦合的,通过API契约进行通信。
每个服务都可以由一个小型的、专注的开发团队构建。单个服务的部署不需要团队之间的大量协调,这鼓励了频繁的更新。微服务体系结构的构建和管理比n层或web队列工作人员更复杂。它需要成熟的开发和DevOps文化。但是如果处理得当,这种风格可以导致更高的发布速度、更快的创新和更有弹性的架构。
事件驱动架构
事件驱动的体系结构使用发布-订阅(发布-订阅)模型,生产者发布事件,消费者订阅事件。生产者独立于消费者,消费者相互独立。
考虑一个事件驱动的架构,用于以极低延迟摄取和处理大量数据的应用程序,如IoT解决方案。当不同的子系统必须对相同的事件数据执行不同类型的处理时,这种样式也很有用。
大数据,大计算
大数据和大计算是适用于特定配置文件的特定工作负载的特定体系结构样式。大数据将非常大的数据集划分为块,在整个集合上执行并行处理,用于分析和报告。大计算,也称为高性能计算(HPC),在大量(数千个)核上进行并行计算。领域包括模拟、建模和3-D渲染。
作为约束的体系结构样式
体系结构样式对设计施加约束,包括可以出现的元素集和这些元素之间允许的关系。约束通过限制选择的范围来指导架构的“形状”。当架构符合特定样式的约束时,就会出现某些需要的属性。
例如,微服务的约束包括:
- 服务代表单一职责。
- 每一种服务都是相互独立的。
- 数据对于拥有它的服务是私有的。服务不共享数据。
通过遵守这些约束,出现的是一个可以独立部署服务、隔离故障、可能频繁更新并且很容易将新技术引入应用程序的系统。
在选择体系结构样式之前,请确保了解该样式的基本原则和约束。否则,您可能最终得到的设计在表面上符合该风格,但并没有实现该风格的全部潜力。务实也很重要。有时候,放松约束比坚持建筑的纯粹性更好。
下表总结了每种样式如何管理依赖项,以及最适合每种样式的域类型。
考虑挑战和好处
约束也会带来挑战,因此在采用任何一种样式时,理解其中的利弊是很重要的。对于这个子域和有限的上下文,体系结构风格的好处是否大于挑战?
以下是一些选择架构风格时需要考虑的挑战类型:
- 复杂性。体系结构的复杂性是否适合您的领域?相反,这种风格对您的域来说太简单了吗?在这种情况下,您可能会得到一个“大泥球”,因为体系结构不能帮助您干净地管理依赖项。
- 异步消息传递和最终的一致性。异步消息传递可以用来解耦服务,提高可靠性(因为消息可以重试)和可伸缩性。然而,这也给处理最终的一致性以及重复消息的可能性带来了挑战。
- 服务间的通信。在将应用程序分解为单独的服务时,存在这样的风险:服务之间的通信将导致不可接受的延迟或造成网络拥塞(例如,在微服务体系结构中)。
- 可管理性。管理应用程序、监视、部署更新等有多难?