服务端技术架构演进之路

news2024/11/30 0:36:05

服务端技术架构演进之路

目录

服务端技术架构演进之路

0.架构中常见概念及理解

1.单机架构

2.应用数据分离架构

3.应用服务器集群架构

4.读写分离/主从分离架构

5.冷热分离架构

6.垂直分库架构

7.微服务架构

8.容器编排架构


       本文以一个 " 电子商务 " 应用为例,介绍从一百个到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,方便大家对后续知识做深入学习时有一定的整体视野。

0.架构中常见概念及理解

应用( Application / 系统( System
        为了完成一整套服务的一个程序或者一组相互配合的程序群。生活例子类比:为了完成一项任务,而搭建的由一个人或者一群相互配的人组成的团队。
模块( Module / 组件( Component
        当应用较复杂时,为了分离职责,将其中具有清晰职责的、内聚性强的部分,抽象出概念,便于理解。生活例子类比:军队中为了进行某据点的攻克,将人员分为突击小组、爆破小组、掩护小组、通信小组等。
分布式( Distributed
         系统中的多个模块被部署于不同服务器之上,即可以将该系统称为分布式系统。如 Web 服务器与数据库分别工作在不同的服务器上,或者多台 Web 服务器被分别部署在不同服务器上。生活例子类比:为了更好的满足现实需要,一个在同一个办公场地的工作小组被分散到多个城市的不同工作场地中进行远程配合工作完成目标。跨主机之间的模块之间的通信基本要借助网络支撑完成。
集群( Cluster
         被部署于多台服务器上的、为了实现特定目标的一个/组特定的组件,整个整体被称为集群。比如多个 MySQL 工作在不同服务器上,共同提供数据库服务目标,可以被称为一组数据库集群。生活例子类比:为了解决军队攻克防守坚固的大城市的作战目标,指挥部将大批炮兵部队集中起来形成一个炮兵打击集群。分布式 vs 集群。通常不用太严格区分两者的细微概念,细究的话,分布式强调的是物理形态,即工作在不同服务器上并且通过网络通信配合完成任务;而集群更在意逻辑形态,即是否为了完成特定服务目标。
主( Master / 从( Slave
         集群中,通常有一个程序需要承担更多的职责,被称为主;其他承担附属职责的被称为从。比如 MySQL 集群中,只有其中一台服务器上数据库允许进行数据的写入(增/删/改),其他数据库的数据修改全部要从这台数据库同步而来,则把那台数据库称为主库,其他数据库称为从库。
中间件( Middleware
         一类提供不同应用程序用于相互通信的软件,即处于不同技术、工具和数据库之间的桥梁。生活例子类比:一家饭店开始时,会每天去市场挑选买菜,但随着饭店业务量变大,成立一个采购部,由采购部专职于采买业务,称为厨房和菜市场之间的桥梁。
容器( Docker
         Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上,也可以实现虚拟化。可以理解为一个集装箱,集装箱里面是每个用户的货物,整体打包
容器编排( K8S
         kubernetes,简称 K8s,是用 8 代替名字中间的 8 个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效。可以理解为一个货船,安装集装箱的大小,货物情况合理的来组织集装箱完成整体货物的搬运。
评价指标:
可用性( Availability
         考察单位时间段内,系统可以正常提供服务的概率/期望。例如: 年化系统可用性= 系统正常提供服务时长 / 一年总时长。这里暗含着一个指标,即如何评价系统提供无法是否正常,我们就不深入了。平时我们常说的 4 个 9 即系统可以提供 99.99% 的可用性,5 个 9 是 99.999% 的可用性,以此类推。我们平时只是用高可用(High Availability HA)这个非量化目标简要表达我们系统的追求。
响应时长( Response Time RT
         指用户完成输入到系统给出用户反应的时长。例如点外卖业务的响应时长 = 拿到外卖的时刻 - 完成点单的时刻。通常我们需要衡量的是最长响应时长、平均响应时长和中位数响应时长。这个指标原则上是越小越好,但很多情况下由于实现的限制,需要根据实际情况具体判断
吞吐( Throughput vs 并发( Concurrent
         吞吐考察单位时间段内,系统可以成功处理的请求的数量。并发指系统同一时刻支持的请求最高量。例如一条 2 车道高速公路,一分钟可以通过 20 辆车,则并发是 2,一分钟的吞吐量是 20。实践中,并发量往往无法直接获取,很多时候都是用极短的时间段(比如 1 秒)的吞吐量做代替。我们平时用高并发(Hight Concurrnet)这个非量化目标简要表达系统的追求。

1.单机架构

        单机架构即应用程序访问量不高,对性能没有很高要求,把web服务器软件(Tomcat)和数据库软件(MySQL)放在一个服务器系统上用户在浏览器中输入www.baidu.com,首先经过DNS 服务将域名解析成IP 地址,随后浏览器访问该IP 对应的应用服务。

2.应用数据分离架构

        随着系统访问量的提升,逐渐逼近了硬件性能的极限,此时我们选择将应用和数据分离的做法,以最小的代价提升系统的承载能力。和之前架构的主要区别在于将数据库服务独立部署在同一个数据中心的其他服务器上,应用服务通过网络访问数据。

3.应用服务器集群架构

 随着用户规模的进一步增大,此时单台应用服务器已经无法满足需求了,我们的应用服务器首先遇到了瓶颈,无法同时处理数万名用户的访问。此时我们有两种方法解决这个问题:

  • 垂直扩展:通过购买性能更优、价格更高的应用服务器来应对更多的流量。
  • 水平扩展:通过调整软件架构,增加应用层硬件,将用户流量分担到不同的应用层服务器上,来提升系统的承载能力。

因为随着硬件性能的提高,它的价格是非线性的,意味着提升两倍性能的硬件可能花费超过四倍的价格,考虑成本,我们选择第二种水平扩展的方案,此时我们又遇到了用户流量该向哪台应用服务器分发的问题。没有什么事情是加一层中间件不能搞定的!此时我们就在用户和应用服务直接加入一个新的组件--负载均衡(Nginx)。常见的流量分发算法:

  1. Round-Robin 轮询算法。 即非常公平地将请求依次分给不同的应用服务器。
  2. Weight-Round-Robin 轮询算法。 为不同的服务器(比如性能不同)赋予不同的权重(weight),能者多劳。
  3. 一致哈希散列算法。 通过计算用户的特征值(比如 IP 地址)得到哈希值,根据哈希结果做分发,优点是确保来自相同用户的请求总是被分给指定的服务器。也就是我们平时遇到的专项客户经理服务。

4.读写分离/主从分离架构

        随着我们把用户请求分发到不同的应用服务器之后,可以承载更多的用户访问了,但随着用户请求的增多,每个用户进行操作都需要从数据库读写数据,此时数据库就成了整个系统的性能瓶颈,并且我们的数据库不能像应用服务器一样通过负载均衡的方式进行扩展,这样会影响数据一致性。 此时我们就要想一个新的解决办法了:

        我们采用的解决办法是这样的,保留一个主要的数据库作为写入数据库,其他的数据库作为从属数据库。从库的所有数据全部来自主库的数据,经过同步后,从库可以维护着与主库一致的数据。然后为了分担数据库的压力,我们可以将写数据请求全部交给主库处理,但读请求分散到各个从库中。应用中需要对读写请求做分离处理,所以可以利用一些数据库中间件(MyCat,TDDL),将请求分离的职责托管出去。

5.冷热分离架构

        随着访问量的持续增加我们发现业务中百分之二十的数据占据了总数据读取频率的百分之八十,也就是所谓的“二八定律”,我们把这部分数据称为热点数据,与之对应的是冷数据,针对热数据,我们选择使用memcached作为本地缓存,使用Redis 作为分布式缓存,以此来加快对这部分数据读取的响应时间。但可能会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集中失效等问题。

6.垂直分库架构

        在上述我们对数据库的处理方案中写数据只在一台机器上进行,没有办法扩展,随着我们的应用逐渐成为爆款,大量的数据存储在同一个库中已经显得有些力不从心了,所以可以按照业务,将数据分别存储。比如针对评论数据,可按照商品ID进行hash,路由到对应的表中存储;针对支付记录,可按照小时创建表,每个小时表继续拆分为小表,使用用户ID或记录编号来路由数据。即实现分库分表。相关实现有Greenplum,TiDB等。

7.微服务架构

        随着人员增加,业务发展,我们将业务分给不同的开发团队去维护,每个团队独立实现自己的微服务,然后互相之间对数据的直接访问进行隔离,可以利用 Gateway、消息总线等技术,实现相互之间的调用关联。甚至可以把一些类似用户管理等业务提成公共服务。相关实现有 Spring Cloud Dubbo等。

8.容器编排架构

         随着业务增长,然后发现系统的资源利用率不高,很多资源用来应对短时高并发,平时又闲置,需要动态扩缩容,还没有办法直接下线服务器,而且开发、测试、生产每套环境都要隔离的环境,运维的工作量变的非常大。容器化技术的出现给这些问题的解决带来了新的思路。

        目前最流行的容器化技术是 Docker,最流行的容器管理服务是 Kubernetes(K8S),应用/服务可以打包为 Docker 镜像,通过 K8S 来动态分发和部署镜像。Docker 镜像可理解为一个能运行你的应用/服务的最小的操作系统,里面放着应用/服务的运行代码,运行环境根据实际的需要设置好。把整个“操作系统”打包为一个镜像后,就可以分发到需要部署相关服务的机器上,直接启动 Docker 镜像就可以把服务起起来,使服务的部署和运维变得简单。

        到此便形成了目前公司主流的高可用,高并发系统,以上系统架构引进对每个小的模块进行了单独的细分,在公司中,很可能同一时间遇到上述的好几个问题,此时就要根据实际问题实际解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2215601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[CS报错] error CS1617: /langversion 的选项“12”无效。使用 “/langversion:?“ 列出支持的值

报错 error CS1617: /langversion 的选项“12”无效。使用 “/langversion:?” 列出支持的值 解决 方法一 升级SDK,升级.NET6.0SDK或者.NET7.0SDK… 方法二 调整项目语言版本: 如果你不想或不能升级 SDK,可以通过调整项目文件 .csproj 中的 Lang…

AFSim仿真系统 --- 系统简解_11 行为与行为树

行为与行为树 行为树是一种人工智能技术,它使用户能够快速创建灵活的行为体,这些行为体包含各种战术模块,称为“行为”或“行为节点”。通过连接节点,可以将这些节点以多样且相互关联的方式组合在一起以定义行为。 快速入门 一…

微软默认软件要是换成这些,工作效率直接飙升10倍不止

你的电脑配置明明比别人高,打开文件却比别人慢,这是为什么? 有可能就是软件的问题,如果微软默认软件都被替换成下面这些宝藏级免费工具,工作效率直接飙升10倍不止! Everything Windows自带的搜索工具速度…

【Linux】配置Mysql 远程连接

文章目录 一、安装 Mysql配置 Mysql修改密码 登录 Mysql设置远程连接开放端口3306详情看蛋卷 一、安装 Mysql sudo yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpmyum -y install mysql mysql-server --nogpgcheck配置 Mysql #MyS…

6款提升工作效率的电脑监控软件推荐

在现代企业管理中,电脑监控软件成为提高工作效率、优化资源配置的关键工具。它们不仅能帮助管理者监控员工的电脑活动,还能提供有助于提升生产力的详细报告和分析。以下是6款广受好评的电脑监控软件,能够帮助企业有效管理和提升员工效率。 1…

邻接矩阵的有向图(C语言代码)

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #define MAXVEX 100//最大顶点数 typedef struct {int vexs[MAXVEX];//存储顶点的数组int matrix[MAXVEX][MAXVEX];//存储邻接矩阵的二维数组int vexnum, edgenum;//顶点数边数 }MGraph;…

【SpringBoot详细教程】-12-SpringBoot整合定时任务 【持续更新】

Hello&#xff0c;大胸弟们&#xff0c;我们又又又见面了&#xff0c;今天攀哥继续为大家分享一下SpringBoot的教程&#xff0c;没点关注的宝宝&#xff0c;点一下关注。 &#x1f332; 定时任务简介 &#x1f33f; 定时任务使用场景 我们在编写SpringBoot应⽤中经常会遇到这…

Python实现文本数据可视化:构建动态词云

引言 在信息爆炸的时代&#xff0c;如何有效地从海量的文本数据中提取关键信息并直观展示&#xff0c;成为数据分析师和研究人员面临的重要挑战。词云作为一种流行的文本可视化工具&#xff0c;通过不同大小、颜色和字体的文字展示文本中关键词的出现频率或重要性&#xff0c;…

<<迷雾>> 第11章 全自动加法计算机(8)--一只开关取数并相加 示例电路

用一只开关就可完成将所有的数从存储器里依次取出并逐个相加的过程. info::操作说明 增加了 指令寄存器 和 译码电路, 扩充了 RR 循环移位寄存器 存储器中前 10 个地址已经提前写入了指令和数值, 其中 17(10001) 代表装载指令, 18(10010) 代表相加指令, 其它则为要加的数. 需检…

vue3--通用 button 组件实现

背景 在日常开发中,我们一般都是利用一些诸如:element-ui、element-plus、ant-design等组件库去做我们的页面或者系统 这些对于一些后台管理系统来说是最好的选择,因为后台管理系统其实都是大同小异的,包括功能、布局结构等 但是对于前台项目,比如官网、门户网站这些 …

StableDiffusion|833种艺术家风格项目,提示词直接上手! AI绘画文生图直接抄!

大家好&#xff0c;我是画画的小强 众所周知&#xff0c;Stable Diffusion是一个强大的文生图模型&#xff0c;能够根据用户的文本描述生成高质量的图像。在这个过程中&#xff0c;提示词&#xff08;Prompt&#xff09;的选择和构造具有至关重要的作用。提示词是向模型描述你…

RPA好用吗?RPA机器人如何使用?

数字化飞速发展的时代&#xff0c;企业越来越追求效率和成本控制&#xff0c;以期在激烈的市场竞争中保持领先地位。在此背景下&#xff0c;RPA机器人流程自动化作为一种能够提升业务流程效率的先进技术&#xff0c;成为助力企业数字化转型和高质量发展的强劲助力。那么&#x…

【前端】制作一个自己的网页(4)

刚才我们完成了网页中标题与段落元素的学习。在实际开发时&#xff0c;一个网页通常会包含多个相同元素&#xff0c;比如多个标题与段落。 对于相同标签的元素&#xff0c;我们又该如何区分定位呢&#xff1f; 对多个相同的标签分类 比如右图设置了七个段落元素&#xff0c;它…

Android ImageView scaleType使用

目录 一、src设置图片资源 二、scaleType设置图片缩放类型 三、scaleType具体表现 matrix&#xff1a; fitXY: fitStart&#xff1a; fitCenter&#xff1a; fitEnd: Center&#xff1a; centerCrop: centerInside&#xff1a; 控制ImageView和图片的大小保持一致…

实例详解 | 借助 Langchain 和 Gemma 2 构建 RAG 应用

本文将为您介绍如何使用 LangChain、NestJS 和 Gemma 2 构建关于 PDF 格式 Angular 书籍的 RAG 应用。接着&#xff0c;HTMX 和 Handlebar 模板引擎将响应呈现为列表。应用使用 LangChain 及其内置的 PDF 加载器来加载 PDF 书籍&#xff0c;并将文档拆分为小块。然后&#xff0…

【Golang】合理运用泛型,简化开发流程

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

测试用例如何进行评估?4个指标

测试用例评估是确保软件测试活动能够达到预期目标的关键步骤。评估测试用例的有效性和质量&#xff0c;对于确保软件产品的质量和可靠性至关重要。如果未对测试用例进行评估&#xff0c;可能导致测试用例不完整、不准确或无效&#xff0c;进而引发需求遗漏、测试不充分等问题&a…

241015_把一个文件夹中的所有图片按照序列命名

241015_把一个文件夹中的所有图片按照序列命名(数据集重命名) 在数据集制作过程中&#xff0c;我们经常会遇到合并图片数据集后命名格式不统一或者因重复命名自动添加&#xff08;1&#xff09;&#xff08;2&#xff09;的问题&#xff0c;以下是一段代码&#xff0c;对合并后…

中国研究员使用量子计算机破解 RSA 加密

由上海大学的 Wang Chao 领导的研究团队发现&#xff0c;D-Wave 的量子计算机可以优化问题解决&#xff0c;从而可以攻击 RSA 等加密方法。 中国研究人员公布了一种使用 D-Wave 的量子退火系统来破解经典加密的方法&#xff0c;这可能会加快量子计算机对广泛使用的加密系统构成…

推荐系统架构

推荐系统架构 推荐和搜索系统核心的的任务是从海量物品中找到用户感兴趣的内容。在这个背景下&#xff0c;推荐系统包含的模块非常多&#xff0c;每个模块将会有很多专业研究的工程和研究工程师&#xff0c;作为刚入门的应届生或者实习生很难对每个模块都有很深的理解&#xf…