当前位置: 首页 > news >正文

互联网应用架构的演进(八大架构的演进过程)

文章目录

    • 前言
    • 常见概念
    • 八大架构演进过程
      • 单机架构
      • 应用数据分离架构
      • 应用服务集群架构
      • 读写/主从分离架构
      • 冷热分离架构
      • 垂直分库架构
      • 微服务架构
      • 容器编排架构

前言

博主最近在学中间件,理解互联网应用架构的演进过程,对于理解中间件在整体结构中的定位是十分重要的

常见概念

应用(Application)/系统(System)
完成某种服务的一个/一组程序

模块(Module)/组件(Component)
系统中,一个独立的功能称之为一个组件

分布式(Distributed)
系统中的模块被部署到多个服务器上,这些模块协同完成一系列工作,这样的系统叫分布式系统

集群(Cluster)
系统中的模块被部署到多个服务器上,完成特定目标的一个/多个模块被称为集群

主(Master)/从(Slave)
集群中,承担更多职责的程序被称为主,承担附属职责的程序被称为从。主节点需要向从节点同步数据

中间件(Middleware)
和业务无关的服务,功能更加通用。1. 数据库 2. 缓存 3. 消息队列

八大架构演进过程

单机架构

将所有服务(应用服务+数据服务)部署在同一台服务器上

用户访问应用服务,应用服务根据用户需求访问数据库服务,并将得到的数据返回给用户
由于互联网早期,应用/web访问量小,所以单机足以满足需求

优点:

  • 部署简单
  • 成本低
    缺点:
  • 存在性能瓶颈,用户无限增长但资源有限
  • 数据库和应用竞争资源

应用数据分离架构

由于单机架构的性能缺陷,当用户量增多时,网站的响应速度变慢
此时演变出了应用数据分离架构:将应用服务和数据服务部署在不同服务器上
应用服务和数据服务间的交互通过网络完成

(具体来说:使用cpp-httplib/Spring编写应用程序,应用服务接收用户请求并将其转换成数据库语句,接着将语句通过数据库客户端与网络发送给数据库服务端,服务端完成数据操作)

对于应用服务器:可以适当增加CPU、内存资源,因为业务的逻辑将占用更多的CPU和内存
而对于存储服务器:可以适当增加磁盘资源,甚至使用SSD固态硬盘,提高数据的读写速度

优点:

  • 性能相比单机架构有所提升
  • 数据库和应用分离,提高了容灾能力

缺点:

  • 硬件成本变高
  • 无法应对海量并发

应用服务集群架构

当用户的请求量增加,应用服务无法及时处理这些海量请求,导致响应时长过长,用户体验差
此时增加应用服务器数量(横向扩展),在应用服务和数据服务之间引入负载均衡(决策层),使应用服务以集群的方式运作。引入负载均衡后,每台应用服务器承担相同的压力

负载均衡器对于请求的承担能力要远大于应用服务器,因为负载均衡器只涉及到分配算法,不需要处理请求

这一架构涉及到两个软件设计哲学:

  1. 一个设备扛不住,就多加几个设备
  2. 没有什么问题是加一层无法解决的

当并发量越来越大时,Nginx扛不住了,那就多用几个Nginx
Nginx一多,无法实现Nginx之间的负载均衡,再引入决策层,使用LVS/F5实现Nginx的负载均衡
LVS/F5也扛不住了,那就多个几个LVS/F5
LVS/F5一多,无法实现负载均衡,直接修改DNS集群(添加多个IP地址),使之作为我们的负载均衡
DNS也扛不住?修改用户电脑的host文件,直接绕过DNS解析

优点:

  1. 应用服务高可用,不会因为一个服务器出问题,整个站点挂掉
  2. 服务具备高性能
  3. 应用服务可以横向扩展

缺点:

  1. 数据服务成为瓶颈
  2. 运维工作增多,维护成本增加
  3. 硬件成本高

读写/主从分离架构

y应用服务能够处理海量请求时,数据服务成为性能瓶颈
将数据服务进行读写/主从分离,主库负责写操作,从库负责读操作。主从数据库使用数据同步技术保证数据一致

为什么要读写分离?互联网应用一般读多写少,部署多个从数据库负责读操作,可以有效地提高响应速度

但是应用服务如何区分读写请求并将其发送给不同的数据库?因此在应用服务和数据服务之间引入一层中间层,该中间层能够识别读写流量被分流(负载均衡)给响应的数据服务。该中间层对应的软件:MyCat,TDDL

优点:

  1. 读写分离后,数据服务的读写能力都得到提升
  2. 数据库拥有从库(备份),可用性(容灾能力)提升

缺点:

  1. 同步服务延迟高或者挂掉时,导致读库和写库数据不一致
  2. 成本进一步地增加
  3. 热点数据的频繁读取导致数据库的负载率很高

冷热分离架构

互联网应用中,20%的数据就能应对80%的请求,这些数据被称为热点数据
对于热点数据,如果能做到更快的读写,那么响应时长将大大减少
所以引入缓存库,将热度高的数据放入缓存库中,由应用服务判断数据是否为热点数据(是否需要访问主从数据库)
缓存库的代表为redis

优点:

  1. 大幅降低数据库的访问请求,性能提高明显

缺点:

  1. 带来了缓存一致性,缓存击穿,缓存失败,缓存雪崩等问题
  2. 成本进一步增加
  3. 数据不断增多时,单个数据库的大小太大,查询速度降低,导致数据库再次成为性能瓶颈

垂直分库架构

冷热分离架构主要是为了应对更高的请求量,但数据服务器的容量有限,当数据量越来越大时,存储是一个问题,如何高效地查询也是一个问题

若库太大:将数据库进行拆分,每个数据服务器存储一个/一部分的数据库(分库)
若表太大:将表进行水平拆分(分表),将不同表的列属性进行拆分,根据类型,属性将字段存储到不同的数据集群中,每个数据集群都有一个主库与多个从库,查询时不会干涉其他从库。使用MyCat/TDDL中间件能够自动分库/分表

如电商网站将用户消息,订单消息,产品消息分割成不同的数据库,每个数据库包含特定类型的数据
典型分布式数据库:Greenplum、TiDB、Postgresql XC、HAWQ 等

优点:

  1. 提高了数据吞吐量,数据服务不再是瓶颈
    缺点:
  2. 处理事务的难度增加
  3. 数据服务和应用服务耦合,应用服务的修改将导致整体服务的重新部署

微服务架构

之前的所有架构,一个应用服务器负责很多业务,这将导致一台服务器的代码变得复杂,同时耦合性增加。为了方便代码的维护,需要将负责复杂业务的服务器进行拆分,拆分成功能单一的更小的服务器(微服务)。同时将开发人员进行分组,以更好地开发与维护服务
微服务是一种架构风格,按照业务模块来划分代码使得每个模块的职责更加清晰,相互之间的迭代升级能够做到独立

之前的架构存在的问题:

  1. 扩展性差:修改一点程序就需要重新构建代码
  2. 持续开发困难:重新构建代码导致无法轻松地发布版本
  3. 不可靠:系统中的一个功能出现bug,导致整个系统出问题
  4. 不灵活:无法使用不同的技术构建单体应用程序
  5. 代码维护难:功能耦合在一起,难以阅读

为解决以上问题,使用了微服务架构
优点:

  1. 灵活性高,部署时弹性大
  2. 独立扩展
  3. 提高容错性
  4. 容易引入新技术
  5. 功能复用

缺点:

  1. 运维复杂度高:例如环境冲突问题
  2. 系统的性能下降:独立出来的每个模块需要通过网络进行通信,网络的速度比磁盘还慢
  3. 处理故障困难:一个请求困难调用了多个微服务,出错难以定位

容器编排架构

借助容器化技术(docker)将应用/服务打包为镜像,通过容器编排工具(如k8s)来动态方法和部署镜像,服务通过容器化方式运行
出现原因:

  1. 微服务拆分太细,服务的部署工作量大,配置复杂容易出错
  2. 微服务之间的运行环境可能冲突,需要更多的资源或者修改配置来解决冲突

优点:

  1. 隔离性好:不会产生环境冲突
  2. 部署、运维简单:k8s的容器编排
  3. 支持滚动更新:版本间的升级与回滚通过命令即可完成
    缺点:
  4. 技术栈多,学习成本高
  5. 服务器成本高

相关文章:

互联网应用架构的演进(八大架构的演进过程)

文章目录 前言常见概念八大架构演进过程单机架构应用数据分离架构应用服务集群架构读写/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构 前言 博主最近在学中间件,理解互联网应用架构的演进过程,对于理解中间件在整体结构中的定位是十分重…...

ROS自学笔记二十六:导航中激光雷达消息

在ROS导航中,激光雷达(Laser Scanner)通常被用于感知机器人周围的环境,进行障碍物检测和建图,以支持导航。下面是激光雷达的详细介绍以及一个示例: 激光雷达简介: 激光雷达是一种传感器&#…...

分类模型的评价指标

评价指标: 1、准确率 2、精准率 3、召回率 4、f1-Score 5、auc曲线 在了解评价指标在hi前,首先需要了解一种叫做混淆矩阵的东西 混淆矩阵: 真正例TP:本来正确的,分类到正确的类型 伪正例FP:本来是错误的&a…...

第五章 I/O管理 八、缓冲区管理

目录 一、定义 二、缓冲区的作用 三、单缓冲 1、定义: 2、例子1 3、例子2 四、双缓冲 1、定义: 2、例子1: 3、例子2: 五、单缓冲和双缓冲的区别 六、循环缓冲区 1、定义: 七、缓冲池 1、定义:…...

笔记软件推荐!亲测好用的8款笔记软件!

​在以往的生活中,我们都需要用纸和笔做笔记,但随着时代的发展,许多人已经不再选择用这种传统方式,来记录自己重要的笔记了,他们都选择将重要的笔记用软件记录下来,将笔记保存在电脑里,更不容易…...

MPJQueryWrapper 用法

// 创建QueryWrapper对象MPJQueryWrapper<WebEvaluation> queryWrapper new MPJQueryWrapper<>();// 设置要查询的字段queryWrapper.select("u.nick_name", "u.avatar_url").select("wu.nick_name as relayToUserName", "ta.c…...

50元买来的iPhone手机刷机经验

前段时间&#xff0c;家里的iPad被家人误操作&#xff0c;导致iPad变成不可使用状态。自己折腾了半天&#xff0c;没有找到解决办法。没有办法&#xff0c;只好拿到手机维修店去修理,很快就修理好了.其实也很简单--就是对iPad进行了刷机操作。当然我也看到了刷机的方法。今天&a…...

数据结构学习笔记——链式表示中的双链表及循环单/双链表

一、双链表 &#xff08;一&#xff09;双链表的定义 双链表是在单链表结点上增添了一个指针域prior&#xff0c;指针域prior指向当前结点的前驱结点&#xff0c;即此时链表的每个结点中都有两个指针域prior和next&#xff0c;从而可以很容易通过后继结点找到前驱结点&#x…...

DC电源模块去除输出电源中的高频噪声及杂波

BOSHIDA DC电源模块去除输出电源中的高频噪声及杂波 DC电源模块是电路中常用的部件&#xff0c;用于提供电子元器件的工作电源。然而&#xff0c;在使用DC电源模块的过程中&#xff0c;往往会出现一些问题&#xff0c;比如输出电源中产生的高频噪声和杂波。这些问题不仅会影响…...

【驱动开发】注册字符设备使用gpio设备树节点控制led三盏灯的亮灭

注册字符设备使用gpio设备树节点控制led三盏灯的亮灭 设备树&#xff1a; 头文件&#xff1a; #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int OD…...

面向制造企业的持续发展,2023数字化工单管理系统创新篇章-亿发

面向制造企业的持续发展&#xff0c;2023数字化工单管理系统开创新篇章-亿发 随着制造业的持续发展&#xff0c;运维工单管理日益成为关键环节&#xff0c;它设计客户管理、设备维护、服务商合作等多个业务领域&#xff0c;对运营效率和服务质量有着重要影响。然而&#xff0c…...

mysql 元数据锁 MDL读锁与MDL写锁

事务一开启事务 begin; select * from tablename;--相当于加了MDL读锁 此时事务2执行alter table tablename add ... --会发生修改阻塞 commit; --提交事务 释放MDL读锁 此时事务二修改成功 如果事务一执行做dml操作&#xff0c;操作期间将加MDL写锁...

批量预处理哨兵2影像

批量预处理哨兵2影像 最近下载70多景哨兵2影像&#xff0c;平均每个影像在cmd中处理时间都需要半个小时。算下来我一景一景手动处理需要37个小时左右&#xff0c;每天在电脑前待8个小时也要4天多&#xff0c;很浪费时间。如果能够批处理&#xff0c;不需要我手动做的话&#x…...

Unity地面交互效果——2、动态法线贴图实现轨迹效果

Unity引擎动态法线贴图制作球滚动轨迹 大家好&#xff0c;我是阿赵。   之前说了一个使用局部UV采样来实现轨迹的方法。这一篇在之前的基础上&#xff0c;使用法线贴图进行凹凸轨迹的绘制。 一、实现的目标 先来回顾一下&#xff0c;上一篇最终我们已经绘制了一个轨迹的贴图…...

视频剪辑达人教您:如何运用嵌套合并技巧制作固定片尾

在视频剪辑的过程中&#xff0c;嵌套合并技巧是一种非常实用的技术&#xff0c;可以帮助您将多个素材叠加在一起&#xff0c;制作出更加丰富多彩的视频。本文将由视频剪辑达人为您详细介绍如何运用云炫AI智剪嵌套合并技巧制作固定片尾&#xff0c;让您的视频剪辑水平更上一层楼…...

【腾讯云 TDSQL-C Serverless 产品体验】TDSQL-C MySQL Serverless最佳实践

一、引言&#xff1a; 随着云计算技术的不断发展&#xff0c;越来越多的企业开始选择将自己的数据库部署在云上&#xff0c;以更好了的支持企业数字化转型以及业务创新&#xff0c;在这个过程中&#xff0c;很多客户会遇到这样一个问题&#xff0c;业务会存在高峰期和低谷期&a…...

SQLyog连接数据库报plugin caching_sha2_password could not be loaded......解决方案

问题描述 问题分析 因为MySQL新版默认使用caching_sha2_password作为身份验证的插件&#xff0c;而旧版本使用的是mysql_native_password。当出现plugin caching_sha2_password could not be loaded报错&#xff0c;我们更换为旧版本 如何解决 先使用cmd命令登录MySQL&a…...

linux应急排查

常用命令 查看登录用户和活动 whoami&#xff1a;显示当前登录用户的用户名。 w&#xff1a;显示当前登录到系统上的用户列表和他们正在执行的命令。 last&#xff1a;显示最近登录到系统的用户列表、登录时间和来源IP地址。 ps aux&#xff1a;列出当前正在运行的所有进程&…...

Apache POI及easyExcel读取及写入excel文件

目录 1.excel 2.使用场景 3.Apache POI 4.easyExcel 5.总结 1.excel excel分为两版&#xff0c;03版和07版。 03版的后缀为xls&#xff0c;最大有65536行。 07版的后缀为xlsx&#xff0c;最大行数没有限制。 2.使用场景 将用户信息导出到excel表格中。 将excel中的数…...

为什么写作

1记录生活&#xff0c;表达自己的想法和情感&#xff0c;提高沟通能力。 2年轻的时候就有写作的意愿&#xff0c;一直未动笔。 3想突破自己看看自己能写到什么程度。锻炼自己更好组织思路&#xff0c;提高逻辑思维能力。 4给自己的生活增添一些爱好&#xff0c;更好地理解和…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...