常用软件架构模式优缺点及应用场景

 1、分层架构模式

最常见的架构模式就是分层架构或者称为 n 层架构。大部分软件架构师、设计师和开发者都对这个架构模式非常熟悉。尽管对于层的数量和类型没有具体限制,但大部分分层架构主要由四层组成:展现层、业务层、持久层和数据库层,如下图所示。

一个很流行的 n 层架构示例 

1.1 上下文 

所有复杂的系统都会经历独立地发展和衍化系统各个部分的需要。出于这个原因,系统开发者需要对关注点进行清晰且条理分明的分离,以便系统的各个模块可以独立地开发和维护。 

1.2 问题 

软件需要以这样一种方式分割:各个模块可以独自开发和衍化,各自部分之间的交互非常少,支持可移植性、可修改性和复用性。 

1.3 方案 

为了实现关注点分离,分层模式将软件分割成各个单元(称为“层”)。每一层都是一组模块,提供了一组高内聚的服务。其使用必须是单向的。层将一组软件作为一个完整的分区,每个分区暴露一个公开接口。

  • 第一个概念是,每一层都有特定的角色和职责。例如,展现层负责处理所有的用户界面。分层架构的这种关注点分离,让构建高效的角色和职责非常简单。
  • 第二个概念是,分层架构模式是一个技术性的分区架构,而非一个领域性的分区架构。它们是由组件组成的,而不是领域。
  • 最后一个概念是,分层架构中的每一层都被标记为封闭或者开放。封闭层意味着请求从一层移到另一层,它必须通过它正下面的这一层才能达到下面这一层的再下一层。请求不能跳过任何层。

封闭层和请求访问 

1.4 弱点

分层会导致性能下降。这种模式不适合高性能应用程序,因为经过架构中的多层来实现一个业务请求的效率是不高的。分层还会增加系统的前期成本和复杂性。 

1.5 用途

应该将这种方式应用于小型简单的应用程序或网站。对于预算和时间非常紧张的场景,这是一个不错的选择。

2、多层模式 

2.1 方案 

一个多层模式示例:消费者网站 J2EE

许多系统的执行结构被组织成一系列逻辑组件分组。每个分组被称为一个层。 

2.1 上下文 

在一个分布式部署中,通常需要将系统的基础设施分到不同的子集中。 

2.2 问题

如何将系统分割到多个计算上独立的执行结构:由一些通信媒介连接的软件和硬件组? 

2.3 弱点 

大量前期成本和复杂性。 

2.4 用途 

用在分布式系统中。

3、管道-过滤器架构

软件架构中反复出现的一种模式是管道 - 过滤器(pipe-filter)模式。

管道过滤器模式 

3.1 上下文 

许多系统需要转换从输入到输出的离散数据流。许多类型转换在实践中重复出现,因此将其创建成独立的可复用的部分,这是比较理想的。 

3.2 问题 

这些系统需要被分割成可复用的松耦合的组件,组件之间拥有简单通用的交互机制。这样它们就可以灵活地相互结合。这些通用松耦合的组件就很容易复用。那些独立的组件可以并行执行。 

3.3 方案 

这种架构中的管道构成了过滤器之间的通信通道。第一个概念是,由于性能原因,每个管道都是非定向的和点对点的,接受来自一个源的输入并经常直接输出到另外一个源。在这种模式中,有如下四种过滤器。

  • producer(source):一个过程的起点。
  • transformer (map):对一些或所有数据进行转换。
  • tester (reduce):测试一个或多个条件。
  • consumer (sink):终点。

3.4 弱点 

不太适合交互性的系统,因为它们的转换特性。过多的解析和反解析会导致性能损失,也会增加编写过滤器本身的复杂性。 

3.5 用途 

管道 - 过滤器架构用于各种应用程序,特别是简化单项处理的任务,例如 EDI、ETL 工具。编译器:连续的过滤器执行词法分析、语法分析、语义分析和代码生成。

4、客户端-过滤器架构

4.1 上下文 

有许多共享资源和服务是大量分布式的客户端希望访问的,希望控制访问或服务质量。 

4.2 问题 

通过管理一组共享资源和服务,可以通过分解公共服务并在单个位置或少数位置进行修改来提高可修改性和复用性。想要通过在将资源本身分布在多个物理服务器上的同时集中控制这些资源和服务,来提高可伸缩性和可用性。 

4.3 方案 

在客户端 - 服务器模式中,组件和连接器具有特定的行为。称为“客户端”的组件将请求发送到称为“服务器”的组件,然后等待回复。服务器组件接收到客户端的请求并向其发送回复。 

4.4 弱点 

服务器会成为性能瓶颈和单点故障位置。在系统建成后,关于功能位置(在客户端还是在服务器)的决策通常是复杂的而且变动成本很大。 

4.5 用途 

对于有许多组件(客户端)发送请求到另外一些提供服务的组件(服务器)的系统,可以使用客户端 - 服务器模式来建模这个系统的一部分:在线应用程序,例如电子邮件、共享文档或银行服务。

5、模型-视图-控制器架构(MVC)

5.1 上下文 

用户界面通常是一个交互性应用程序的最频繁被修改的部分。用户通常希望从不同的视角查看数据,例如柱状图或者饼图。这些表示形式都应该反映数据当前的状态。 

5.2 问题 

用户界面功能如何独立于应用程序功能,同时还还对用户输入或底层应用程序数据的更改做出响应?当底层应用程序数据更改时,如何创建、维护和协调用户界面的多个视图? 

5.3 方案 

模型 - 视图 - 控制器(model-view-controller,即 MVC)模式将应用程序功能分为以下三种类型的组件:

  • 模型,包含应用程序的数据。
  • 视图,显示部分底层数据并与用户交互。
  • 控制器,在模型和视图之间进行中介并管理状态更改的通知。

5.4 弱点 

对于简单的用户界面,其复杂性并不值得这么做。模型、视图和控制器抽象可能不适用于某些用户界面工具包。 

5.5 用途 

MVC 是网站或移动应用程序开发用户界面常用的一种架构模式。

6、事件驱动架构 

6.1 上下文 

需要提供计算和信息资源来处理传入的应用程序生成的独立异步事件,这种方式可以随着需求的增加而扩展。 

6.2 问题 

构建分布式系统,这个系统可以服务异步到达的事件相关信息,并且能从简单小型扩展到复杂大型。 

6.3 方案 

为事件处理部署独立的事件进程或处理器。到达的事件进入队列。调度程序根据调度策略从队列中拉取事件并将它们分配到合适的事件处理器。 

6.4 弱点 

性能和错误恢复可能是问题。 

6.5 用途 

使用这个方案的电商应用程序将工作如下:Order Service 创建一个 Order,这个订单处于待定状态,然后发布一个OrderCreated事件。Customer Service 接收到这个事件并尝试为这个 Order 扣除信用。然后发布一个 Credit Reserved 事件或者CreditLimitExceeded(超出信用限额)事件。Order Service 接收到 Customer Service 发送的事件并将订单状态更改为已核准或已取消。

7、微服务架构 

7.1 上下文 

部署基于服务器的企业应用程序,支持各种浏览器和原生移动客户端。应用程序通过执行业务逻辑、访问数据库、与其它系统交换信息并返回响应来处理客户端请求。这个应用程序可能会暴露一个第三方 API。 

7.2 问题 

一体化应用程序会变得过于庞大和复杂,无法得到有效支持和部署来实现最优的分布式资源利用,例如在云环境中。 

7.3 方案 

将应用程序构建成服务套件。每个服务都是独立部署和可扩展的,拥有自己的 API 边界。不同的服务可以用不同的编程语言编写,管理它们自己的数据库,由不同的团队开发。 

7.4 弱点 

系统设计必须能容忍服务失败,需要更多的系统监控。服务编排和事件协作开销比较大。当然,还需要更多钱。 

7.5 用途 

许多使用场景都可以应用微服务架构,特别是那些涉及大量数据管道的场景。例如,一个微服务系统对关于一个公司的零售店销售的报表系统会比较理想。数据展现过程的每一步都会被一个微服务处理:数据收集、清理、规范化、浓缩、聚合、报告等。

什么是架构模式及常用的架构模式:10种常见的软件架构模式-CSDN博客

架构风格:12种常见的软件架构风格-CSDN博客

  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
关系数据库和分布式数据库都是常见的数据库类型,它们在不同的使用场景中有各自的优缺点。 关系数据库(RDBMS)适用于需要严格的数据一致性和事务支持的场景,其中最常用的是SQL数据库。它们使用表格和预定义的模式来存储数据,具有以下优点和缺点: 优点: 1. 数据一致性:关系数据库使用事务支持来确保数据的一致性和完整性。 2. 数据完整性:可以通过定义外键和约束来强制实施数据完整性。 3. 查询灵活性:使用SQL查询语言可以轻松地执行复杂的查询和连接操作。 4. 安全性:关系数据库提供了访问控制和权限管理机制,以保护数据的安全性。 缺点: 1. 扩展性限制:传统的关系数据库在处理大规模数据和高并发请求时可能存在性能瓶颈。 2. 单点故障:关系数据库通常是单点故障,如果数据库服务器发生故障,整个系统可能会受到影响。 3. 难以水平扩展:在传统关系数据库中,水平扩展(通过增加更多的服务器来提高性能)可能比较困难。 分布式数据库适用于需要处理大规模数据和高并发请求的场景,它们将数据分布在多个物理节点上,并利用集群来实现高可用性和性能。分布式数据库的例子包括Hadoop、Cassandra、MongoDB等。它们具有以下优点和缺点: 优点: 1. 高可扩展性:分布式数据库可以通过增加更多的节点来实现水平扩展,以处理大规模数据和高并发请求。 2. 高可用性:由于数据在多个节点上复制,分布式数据库可以提供更高的可用性,即使某个节点出现故障,系统仍然可以继续运行。 3. 弹性伸缩:可以根据需要增加或减少节点的数量,以适应负载的变化。 缺点: 1. 一致性挑战:分布式系统中实现数据一致性可能更加复杂,需要使用一致性协议来解决数据同步和冲突问题。 2. 难以管理:管理和维护分布式数据库集群可能比较复杂,需要考虑分布式事务、数据分片等方面。 3. 较高的成本:分布式数据库通常需要更多的硬件和资源来支持集群架构,这可能导致较高的成本。 总而言之,关系数据库适用于需要严格的数据一致性和事务支持的场景,而分布式数据库适用于需要处理大规模数据和高并发请求的场景。选择适合的数据库类型应根据具体的应用需求和性能要求来进行评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

p@nd@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值