高并发系统设计之架构分层

ops/2024/11/13 16:09:01/

文章目录

    • 什么是分层架构
    • 分层有什么好处
    • 如何来做系统分层
    • 分层架构的不足

什么是分层架构

  • 软件架构分层在软件工程中是一种常见的设计方式,它是将整体系统拆分成 N 个层次,每个层次有独立的职责,多个层次协同提供完整的功能。
  • “MVC”(Model-View-Controller)架构。它将整体的系统分成了 Model(模型),View(视图)和 Controller(控制器)三个层次,也就是将用户视图和业务处理隔离开,并且通过控制器连接起来,很好地实现了表现和逻辑的解耦,是一种标准的软件分层架构
    在这里插入图片描述
  • 另外一种常见的分层方式是将整体架构分为表现层、逻辑层和数据访问层:
    • 表现层,顾名思义嘛,就是展示数据结果和接受用户指令的,是最靠近用户的一层;
    • 逻辑层里面有复杂业务的具体实现;
    • 数据访问层则是主要处理和存储之间的交互。
  • 这是在架构上最简单的一种分层方式。其实,我们在不经意间已经按照三层架构来做系统分层设计了,比如在构建项目的时候,我们通常会建立三个目录:Web、Service 和 Dao,它们分别对应了表现层、逻辑层还有数据访问层。
    在这里插入图片描述
  • Linux 文件系统也是分层设计的,可以清晰地看出文件系统的层次。在文件系统的最上层是虚拟文件系统(VFS),用来屏蔽不同的文件系统之间的差异,提供统一的系统调用接口。虚拟文件系统的下层是 Ext3、Ext4 等各种文件系统,再向下是为了屏蔽不同硬件设备的实现细节,我们抽象出来的单独的一层——通用块设备层,然后就是不同类型的磁盘了。可以看到,某些层次负责的是对下层不同实现的抽象,从而对上层屏蔽实现细节。比方说 VFS 对上层(系统调用层)来说提供了统一的调用接口,同时对下层中不同的文件系统规约了实现模型,当新增一种文件系统实现的时候,只需要按照这种模型来设计,就可以无缝插入到 Linux 文件系统中。
    在这里插入图片描述

分层有什么好处

  • 分层的设计可以简化系统设计,让不同的人专注做某一层次的事情。
  • 想象一下,如果你要设计一款网络程序却没有分层,该是一件多么痛苦的事情。
    • 因为你必须是一个通晓网络的全才,要知道各种网络设备的接口是什么样的,以便可以将数据包发送给它。你还要关注数据传输的细节,并且需要处理类似网络拥塞,数据超时重传这样的复杂问题。当然了,你更需要关注数据如何在网络上安全传输,不会被别人窥探和篡改。
    • 而有了分层的设计,你只需要专注设计应用层的程序就可以了,其他的,都可以交给下面几层来完成。
    • 再有,分层之后可以做到很高的复用。比如,我们在设计系统 A 的时候,发现某一层具有一定的通用性,那么我们可以把它抽取独立出来,在设计系统 B 的时候使用起来,这样可以减少研发周期,提升研发的效率。
    • 最后一点,分层架构可以让我们更容易做横向扩展。如果系统没有分层,当流量增加时我们需要针对整体系统来做扩展。但是,如果我们按照上面提到的三层架构将系统分层后,那么我们就可以针对具体的问题来做细致的扩展。

如何来做系统分层

  • 最主要的一点就是你需要理清楚每个层次的边界是什么。你也许会问:“如果按照三层架构来分层的话,每一层的边界不是很容易就界定吗?”没错,当业务逻辑简单时,层次之间的边界的确清晰,开发新的功能时也知道哪些代码要往哪儿写。但是当业务逻辑变得越来越复杂时,边界就会变得越来越模糊。我们可以将原先的三层架构细化成下面的样子:
    在这里插入图片描述
  • 分层架构中的每一层的作用:
    • 终端显示层:各端模板渲染并执行显示的层。当前主要是 Velocity 渲染,JS 渲染, JSP 渲染,移动端展示等。
    • 开放接口层:将 Service 层方法封装成开放接口,同时进行网关安全控制和流量控制等。
    • Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
    • Service 层:业务逻辑层。
    • Manager 层:通用业务处理层。这一层主要有两个作用,其一,你可以将原先 Service 层的一些通用能力下沉到这一层,比如与缓存和存储交互策略,中间件的接入;其二,你也可以在这一层封装对第三方接口的调用,比如调用支付服务,调用审核服务等。
    • DAO 层:数据访问层,与底层 MySQL、Oracle、Hbase 等进行数据交互。
    • 外部接口或第三方平台:包括其它部门 RPC 开放接口,基础平台,其它公司的 HTTP 接口。
  • 在这个分层架构中主要增加了 Manager 层,它与 Service 层的关系是:Manager 层提供原子的服务接口,Service 层负责依据业务逻辑来编排原子接口。

分层架构的不足

  • 任何事物都不可能是尽善尽美的,分层架构虽有优势也会有缺陷,它最主要的一个缺陷就是增加了代码的复杂度。
  • 这是显而易见的嘛,明明可以在接收到请求后就可以直接查询数据库获得结果,却偏偏要在中间插入多个层次,并且有可能每个层次只是简单地做数据的传递。有时增加一个小小的需求也需要更改所有层次上的代码,看起来增加了开发的成本,并且从调试上来看也增加了复杂度,原本如果直接访问数据库我只需要调试一个方法,现在我却要调试多个层次的多个方法。
  • 另外一个可能的缺陷是,如果我们把每个层次独立部署,层次间通过网络来交互,那么多层的架构在性能上会有损耗。这也是为什么服务化架构性能要比单体架构略差的原因,也就是所谓的“多一跳”问题。
  • 那我们是否要选择分层的架构呢?答案当然是肯定的。你要知道,任何的方案架构都是有优势有缺陷的,天地尚且不全何况我们的架构呢?分层架构固然会增加系统复杂度,也可能会有性能的损耗,但是相比于它能带给我们的好处来说,这些都是可以接受的,或者可以通过其它的方案解决的。我们在做决策的时候切不可以偏概全,因噎废食。

你知道的越多,你不知道的越多。


http://www.ppmy.cn/ops/133349.html

相关文章

ffmpeg内存模型

文章目录 展示图拷贝packet 重要!!!avpacket.c相关函数av_packet_alloc 简单的赋值 里面的还有没有进行初始化的指针av_packet_ref 展示图 拷贝packet 拷贝packet有两种情况 1: 两个packet的buf引用的是同一个数据缓冲空间&#…

WebPages 安全

WebPages 安全 1. 引言 随着互联网的普及和信息技术的发展,Web页面已经成为人们获取信息、进行交流和开展业务的重要平台。然而,随之而来的安全问题也日益突出,如跨站脚本攻击(XSS)、跨站请求伪造(CSRF&a…

switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?

在Java中,Switch语句是一种多分支选择结构,用于根据变量的值选择执行不同的代码块Switch语句可以作用于以下几种数据类型: 1.byte,short,char,int:这些都是基本数据类型,switch语句可以直接作用于它们 2.枚举类型(enum):从Java5开始,switch语句可以作用于枚举类型。 3.字…

深度学习知识点3-CBAM轻量的注意力模块

论文:(2018)包含空间注意力和通道注意力两部分1807.06521https://arxiv.org/pdf/1807.06521 通道注意力:对input feature maps每个feature map做全局平均池化和全局最大池化,得到两个1d向量,再经过conv&…

如何让3dsMax渲染效果更逼真好看?

一、选择合适的渲染器 Arnold: 强大且适应性强,能够满足多种场景和需求,提供高品质的全局照明和精确的物理材质。 V-Ray: 渲染速度快,功能全面,擅长复杂光照和材质处理,配备高效的降噪工具。 Corona Renderer: 用户…

IDEA接入OpenAI API 方法教程

在 IntelliJ IDEA 中接入 ChatGPT API,你需要以下几个步骤: 步骤 1: 获取 OpenAI API 密钥 访问 OpenAI 官方网站,注册并登录到你的账户。进入你的账户设置页面,获取 API 密钥。将 API 密钥保存在一个安全的地方,因为…

生成 Django 中文文档 PDF 版

文章目录 背景克隆 Django 文档和翻译仓库配置 conf.py设置和同步翻译生成 .pot 文件运行 sphinx-intl update复制翻译文件 构建 PDF生成 tex 文件安装 MikTeX生成 PDF Sphinx 生成文档 背景 浏览看到一个帖子,有个评论说可以用 sphinx 构建一个 pdf,正…

C++初阶——list

一、什么是list list是一个可以在序列的任意位置进行插入和删除的容器,并且可以进行双向迭代。list的底层是一个双向链表,双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。通过将每个元素与前一个元素的链接和后一个元素的链接关联起来&…