后台系统可扩展性学习笔记(一)概要

article/2025/8/4 8:23:54

文章目录

  • 系统大致架构
  • 可扩展性
  • 负载均衡器与会话保持
  • 引入冗余增强系统可用性
  • 缓存减轻数据库压力
  • 异步处理
  • 参考

系统大致架构

当一个用户请求从客户端出发,经过网络传输,达到 Web 服务层,接着进入应用层,最后抵达数据层,它所途径的过程如下:
在这里插入图片描述
对应到系统设计的逻辑层:
在这里插入图片描述
运作机制如下:
1、客户端查DNS得到服务对应的IP地址,可能指向位于Web服务之前的负载均衡器,也可能是CDN,就近提供对象存储中的静态资源
2、发向Web服务的请求被负载均衡器(如反向代理)按照既定策略分给相应的Web服务器,进入应用层
3、请求到达应用层后,经过Service Discovery、Service Mesh等服务查询机制找到目标微服务,开始处理请求
4、数据请求会通过一系列读写操作转移到数据层,异步的操作还会进入消息队列排队,但最终都会抵达数据层
5、对热点数据的请求会被数据库之前的缓存层挡下,其余的落到数据库,可能是经过分库分表、反范式优化,并由复制机制保证数据一致性的SQL数据库,也可能是查询性能更好的Nosql数据库抑或是对象存储来保存数据。

接下来的系统设计主要就是围绕这几个关键的逻辑组件展开。

可扩展性

可扩展性,意味着能够通过向系统添加资源的方式应对不断增加的工作量。而加资源有两种方式:

  • 纵向扩展(Vertical scaling):即提升单机配置,对单台机器加内存、处理器、硬盘等硬件资源。投入足够多的预算,就能砸出一台配置豪华的服务器
  • 横向扩展(Horizontal scaling):即加机器,数量上从一台扩展到多台,多服务器形成拓扑结构。投入足够多的预算,就能拥有一个机房,甚至遍布全球的数据中心
    对于系统设计而言,可扩展性要求系统能够将加入进来的更多资源(如多核、多机)利用起来。
    机器由一台变成多台之后,面临的最大问题是资源分配,如何充分利用这些机器?即,如何均衡负载?

负载均衡器与会话保持

负载均衡器(Load Balancer)负责把用户请求分发到多个服务器上,具体的,公网 Load Balancer 根据路由规则分发入站 HTTP 请求,决定把数据包实际发送给哪个内网服务器。常见的策略是基于负载情况分发、轮流均分、基于资源依赖情况分发。不建议用 DNS 来充当负载均衡器,因为操作系统以及应用层的 DNS 缓存会破坏这种轮流均分的机制。另一方面,不同类型的服务对资源的依赖情况(带宽、存储、计算能力等)可能不一样,所以也可以采用专用服务器,并根据资源依赖情况分发,比如对 gif、jpg、image、video 等使用不同的专用服务器,并通过子域名等方式来区分
会话保持:
加一层 Load Balancer 解决了资源分配的问题,但又带来了一个新问题:前后两个请求可能被负载均衡器转发到不同的服务器上,如果这两个请求有关联(比如登录和下单),前置的状态就会丢失(用户刚登录完点击下单接着可能又要求登录)
一种解决办法是粘滞会话(Sticky sessions),把相关联的请求转发给同一台服务器:
比如在 Cookie 中带上服务器的标识信息,之后的一系列请求都转给那台服务器,但 Cookie 可能会被禁用,因此一般会综合使用多种方式来保持会话
另一种方案是把 Session“外包”出去,存放到公共的地方,供其它服务器共享访问:
每台服务器都包含完全相同的代码库,不在本地光盘或内存中存储任何与用户相关的数据,如会话或个人资料图片。会话需要存储在所有应用服务器都可以访问的集中数据存储中。
至此,我们增加了一些机器,并通过一个负载均衡器让多台机器共同分担运转起来了,看起来一切都很完美……那么,如果这个负载均衡器 down 掉了呢?

引入冗余增强系统可用性

引入负载均衡器之后,所有请求都要先经过负载均衡器,负载均衡器就成为了网络拓扑结构中脆弱的单点,一旦发生故障,身后的所有服务器就都无法访问了。
为了避免单点故障(Single Point of Failure),负载均衡器同样需要引入冗余(比如使用一对儿负载均衡器),一般有两种故障转移(Fail-over)模式:

  • 主动-被动(Active-passive):主动的工作,被动的备用,主动的 down 掉后被动的上
  • 主动-主动(Active-active):同时工作,一个 down 掉之后不影响
    无论采用哪种工作模式,引入冗余都能缩短宕机时间,提升系统可靠性与可用性

理论上,有了可靠的负载均衡机制,我们就能将 1 台服务器轻松扩展到 n 台,然而,如果这 n 台机器仍然使用同一数据库的话,很快数据库就会成为系统的性能瓶颈和可靠性瓶颈
如法炮制,我们可以扩展数据库的处理能力,多加几个库,即引入冗余,一般有两种模式:

  • 主从复制:主库直接读写,从库在主库收到查询时,执行相同的查询。如果主库 down 掉了,就在从库里面提升一个作为主库
  • 主主复制:都可以写,写操作也会被复制到另一个库中
    数据库引入冗余之后,甚至还能对多个从库进行负载均衡(尤其适用于读密集的场景):
    在这里插入图片描述
    以及按内容特点分区存储(Partitioning):
    在这里插入图片描述
    将姓名以 A-M 开头的数据存放到左边的几个数据库,N-Z 开头的存放到右边

同时,也可以通过分库分表(Sharding)、反范式化(Denormalization)、SQL 调优(SQL tuning)等方式优化查询

缓存减轻数据库压力

尽可能减少数据库操作,比如在 Web 服务与数据之间增加一层内存缓存,查询时优先走缓存,缓存中没有才从数据库中取。
一般有两种缓存模式:

  • 缓存查询结果
  • 缓存对象
    缓存所有查询结果最大的问题在于,数据发生变化后,很难判定缓存是否过期:
在缓存复杂查询时,很难删除缓存的结果(谁没有?)。
当一段数据发生更改(例如表单元格)时,需要删除可能包含该表单元格的所有缓存查询。

而缓存对象是指缓存根据原始数据组装出的数据模型(比如一个 Java 类实例),优势在于获知数据变化之后,能够丢弃与之具有逻辑关联的数据对象,从而解决缓存过期的难题。
至此,我们已经自下而上地讨论了包括硬件资源、数据库、缓存在内的可扩展性问题,那么,Web 服务自身应该如何扩展?

异步处理

对于 Web 服务而言,提升可扩展性的主要途径是将耗时的同步工作改成异步处理,从而允许将这些工作“外包”给多个 Worker 去做,或者提前完成能够预知的部分.

参考

1、http://gotocon.com/dl/goto-aar-2012/slides/MartinThompson_ItsAllANumbersGameTheDirtyLittleSecretOfScalableSystems.pdf
2、http://www.ayqy.net/blog/scalability-in-the-real-world/
3、https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md


http://chatgpt.dhexx.cn/article/e9PBP8yb.shtml

相关文章

1.3 可扩展性

即使一个系统现在可以可靠地工作,但并不意味着未来它也一定会可靠地工作。造成退化的一个常见的原因就是日益增加的负载:系统的并发用户可能从10000增加到了100000,或者从1000000增加到10000000。可能它处理的数据量比之前大得多。可扩展性是…

七种方法增强代码可扩展性(多图详解)

1 六大原则 在设计模式中有六大设计原则: 单一职责原则:一个类只做一件事 里式替换原则:子类可以扩展父类 依赖倒置原则:面向接口编程 接口隔离原则:高内聚低耦合 迪米特法则:最少知道原则 开闭原则&#…

系统复杂度之【可扩展性】

紧接着我们来聊聊可扩展性。 可扩展性是指,软件系统具备面对未来需求变化而进行扩展的能力。系统可根据新的需求做出少量或者不需要修改,无需对整个系统进行重构或重建。 由于软件系统变化多端,新的需求不断提出,因此可扩展性非常…

php文字链接下划线怎么取消,html超链接怎么去掉下划线

html超链接怎么去掉下划线? 可以用css的text-decoration:none来取消连接的下划线 这是一个链接 扩展资料: 超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准,它通过标记符号来标记要显示的网页中…

html去除超链接标记,html超链接去掉下划线的方法

html超链接去掉下划线的方法 发布时间:2020-04-03 15:16:00 来源:亿速云 阅读:59 作者:小新 今天小编给大家分享的是html超链接去掉下划线的方法,很多人都不太了解,今天小编为了让大家更加了解html超链接去…

<el-tabs>改变样式(去掉下划线及其他样式)

elemen-ui官方文档中给的标签页是蓝色的&#xff0c;长这样 我想要的样子&#xff1a; 这里重点是去掉原来的下划线以及鼠标悬停时的背景颜色&#xff0c;话不多说直接上代码&#xff1a; <div class"leftTabs"><el-tabs v-model"activeName" c…

html怎么消除链接字体,CSS去掉超链接下划线

div css之去掉A超链接下划线样式 一、去掉字体下划线装饰CSS属性样式代码 text-decoration:none 解释&#xff1a; CSS下划线样式单词&#xff1a;text-decoration 不显示下划线(去掉字体下划线样式)&#xff1a;none 二、div css网页重构前初始化去掉超链接下划线 由于有的浏览…

html更改超链接下划线颜色,超链接去掉下划线_WORD中不取消超链接,只改超链接的颜色和去掉下划线...

ppt超链接去掉下划线 1、首先打开PPT。2、“插入”“文本框”“横排文本框”,在空白处写字,调整字的大小等。3、插入”“超链接”,会出现“插入超链接”对话框,在这里选择需要链接到的位置,点击确定。4、这时出现的超链接字体就会有下划线。 5、我们在这里选中超链接字体右…

html超链接下划线改虚线_html超链接去掉下划线 html去除取消超链接下划线

大多时候我们知道&#xff1a;text-decoration:underline &#xfffd;?strong>显示下划&#xfffd;?/strong>&#xfffd;?/p> html中去除去&#xfffd;?a href"//www.css5.com.cn/html/989.shtml">A标签超链接下划线代码&#xfffd;?br /> …

php中超链接怎么去下划线的,html如何去掉超链接下划线?html超链接去掉下划线的方法介绍...

前端网页的开发中总是不可避免会使用到超链接&#xff0c;但是使用超链接时下面都会有一条下划线&#xff0c;这在网页中有时会显得很突兀&#xff0c;不合适也不美观&#xff0c;所以我们就需要将超链接下的这条下划线给去掉&#xff0c;接下来的这篇文章就来给大家介绍html下…

html5中链接去除下划线,html超链接去掉下划线 html去除取消超链接下划线

html a超链接标签&#xff0c;默认有的涉猎器表现有下划线&#xff0c;有的不有下划线&#xff0c;大多锚文本超链接A标签内字体是有下划线的&#xff0c;怎么去除超链接下划线&#xff1f;html 超链接去除下划线怎么样做&#xff1f; 去掉去除超链接锚文本的下划线需要CSS花样…

html如何取消表格的横线,怎么去掉下划线样式?

怎么去掉超链接下划线?下面本篇文章给大家介绍一下在html网页和word文档中去掉下划线样式的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 html代码中去掉超链接的下划线 前端网页的开发中总是不可避免会使用到超链接,但是使用超链接时下面都会有…

word里边页眉下面的下划线怎么去掉

原创作品&#xff0c;出自 “深蓝的blog” 博客&#xff0c;欢迎转载&#xff0c;转载时请务必注明以下出处&#xff0c;否则追究版权法律责任。 深蓝的blog&#xff1a;http://blog.csdn.net/huangyanlong/article/details/43762599 今日在使用word编辑统计表时&#xff0c;添…

为什么电流镜的复制电路是二极管结构?

左图是电流镜的概念图&#xff0c;复制电路偏置在IREF&#xff0c;为右边的管子提供一个偏压VGS。右图是最典型的电流镜结构&#xff0c;今天的问题是为什么复制电路结构用二极管连接结构&#xff0c;不用CS&#xff0c;CD或者CG中的一种呢&#xff1f; 首先我们得明确复制电路…

电流镜电路公式推导

最近复习了硬件笔试题。碰到了这个题&#xff0c;遂写一下自己的推导过程。 电流镜原理图&#xff08;假设三个管子的是参数理想一致的情况&#xff09; 基于 KCL 公式 -->>> Ie1 Ib2 Ib3 基于 BJT放大关系 -->>> Ie1 Ib1 *(1β)基于 KCL 公式 -->…

有源电流镜-下-第十学时

第10学时&#xff0c;电流镜电路&#xff0c;已发布&#xff0c;详见网易云课堂系列精品课程&#xff1a;《CMOS模拟集成电路设计》&#xff0c;由陈博士主讲&#xff0c;链接地址&#xff1a; https://study.163.com/course/introduction.htm?share2&shareId40000000067…

电流镜电流--第10学时

第10学时&#xff0c;电流镜电路&#xff0c;​已发布&#xff0c;详见网易云课堂系列精品课程&#xff1a;《CMOS模拟集成电路设计》&#xff0c;由陈博士主讲&#xff0c;​链接地址&#xff1a; https://study.163.com/course/introduction.htm?share2&shareId40000000…

电流镜电路

控制左边的电流 镜像到右边电流

cascode电流镜

下面的镜像管决定电流。