系统设计基础-大型网站通用架构模式

news2024/12/29 23:25:07

文章目录

      • 一.何谓模式
      • 二.通用架构模式
        • 1.分层
        • 2.分割
        • 3.分布式
        • 4.集群
        • 5.缓存
        • 6.异步处理
        • 7.冗余备份
        • 8.自动化
        • 9.安全

本文主要参考自《大型网站技术架构:核心原理与案例分析》一书第二章节和其他网络文章,如有遗漏或错误,还望海涵并指出。谢谢!

在这里插入图片描述

好的设计绝对不是模仿,不是生搬硬套某个模式,而是在对问题深刻理解之上的创造与创新,即使是“微创新”,也是让人耳目一新的似曾相识。山寨与创新的最大区别不在于是否抄袭,是否模仿,而在于对问题和需求是否真正理解和把握。
–《大型网站技术架构:核心原理与案例分析》

一.何谓模式

“每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复工作”。

模式的关键在于模式的可重复性,问题与场景的可重复性带来解决方案的可重复使用。

例如23种设计模式就是后端开发领域前人对于如何设计程序的可拓展性、可靠性和易用性的高度总结,许多经典的软件以及框架都参考和借鉴了这些经典的设计模式,并且在这之上做出了许多的创新。

对于技术的学习也是一样的,当务之急是知道如何使用技术来解决现实问题(how?),但是更重要的一点在于了解技术到底是如何解决问题的、背后的思想是什么、模式是什么(why?),然后应用在自身的技术或业务中。要站在巨人的肩膀上创新。

二.通用架构模式

1.分层

分层是计算机领域中一种常见的思想,例如计算机网络中,通过将不同的技术和规范分为七层,由下层来服务上层,而上层可以只做好自己的事情就好了,不必理会下层是如何提供的服务,上下层之间只需要约定好接口就够了,降低了耦合度。

如在Java的Web服务开发过程中,也常常需要将整个项目分为控制层、业务层、数据交互层等层次,让它们各种来解决各自的问题即可。这样能够起到逻辑清晰,代码依赖性低的作用

2.分割

分层可以是做将项目进行水平切分,而分割可以视为将项目进行垂直切分。

分割指的是将项目分割为不同的业务线和模块,譬如一个购物网站可以按业务的不同分为首页业务、购物车业务、商品管理业务、用户管理业务等,然后由不同的团队负责开发。

3.分布式

随着应用越来越大,并发的访问也越来越多,此时单体的应用可能无法承受这么大的压力,所以此时出现了分布式的服务,一台机器处理不了的请求,可以分发给其他的机器处理。

分布式系统指的是由多台不同的主机共同提供资源来组成服务。

常见的分布式方案有一下几种:

1.分布式的应用与服务:将大应用拆分为多个小应用或服务分开部署

2.分布式静态资源:将网站的静态资源如JS、CSS、图片和文件等独立部署

3.分布式数据与存储:将数据库和应用分离,单独部署

4.分布式计算:将耗费大量计算资源的服务,例如大数据分析、机器学习训练集等进行单独等部署

分布式系统会出现哪些挑战或问题?

1.分布式的主机之间需要通过网络连接,所以网络状况可能会对分布式系统造成重大影响。根据CAP理论,当网络分区(Partition)发生时,分布式主机数据间的一致性(Consistent)和服务的可用性(Avaliable)只能保证一个。要不就是一致性等不到保证、要不就是可用性等不到保证。

2.各种服务和资源分散在不同的机器上,如何保证机器宕机时数据的不丢失以及服务的恢复。

4.集群

分布式的系统下,将不同作用的服务拆分到不同的机器上面,而集群要做的事情和分布式相似,就是提高可接受的访问压力和保证服务的可用性;但是对于集群来说,集群中的不同机器提供的是同一服务。

例如Redis的集群由两台服务器组成,每台服务器提供的服务都是一样的,客户端的请求具体会被哪台服务器处理需要通过负载均衡算法来判断;当其中一台机器宕机时,仍有一台机器可以继续提供服务。

5.缓存

缓存就是通过将数据放到能够更快速访问到的地方以加快访问速度。

缓存可以分为以下几种:

1.CDN:内容分发网络可以将请求转发到距离用户最近的服务器,或者是直接返回已经存在的数据,加快资源的访问速度

2.反向代理:通常反向代理服务器中缓存有网站的静态资源(如Nginx),可以加快访问速度

3.本地缓存:本地缓存即存在于应用程序中或是本地服务器上的缓存数据,可用ehcache技术来实现

4.分布式缓存:对于大量的请求和大量的缓存数据,更常见的做法是使用分布式缓存服务,例如Redis集群等

使用缓存有以下两个前提:

1.被缓存的数据应该是经常被访问、但是更改不是很频繁的热点数据。

2.被缓存的数据应该具有一定的时效,而不能很快就过期,不然会产生脏读现象

6.异步处理

大型网站架构中,不仅可以通过分层、分割、分布式来进行解耦和提高性能,还可以使用异步处理的方式,异步处理主要是通过消息队列(如Kafka、ActiveMQ)来构建不同系统或机器、应用之间的通信,消息队列的两端被称为生产者与消费者,其主要的作用如下:

1.提高系统可用性:设想这样的一个场景,系统正在处理大量的订单数据,此时服务器突然宕机,那么订单数据可能没被处理完就丢失了,此时如果使用消息队列来存储订单数据,如果系统出现宕机,那么在重启机器之后,消息队列由于拥有持久化机制,所以消息队列中的数据并不会丢失,而是可以继续被消费者消费并处理,这就提升了系统的可用性。

2.加快服务响应速度:当生产者接收到数据,并且放入消息队列时即可返回响应,而不需要等待整个业务的处理完成,而消费者取到消息后才会进行真正的业务处理。

3.消除并发访问高峰:有时系统突然出现了高于平常的访问大于系统处理能力时,可能会发生阻塞或使系统宕机,例如抢购等操作。此时可以将请求放入消息队列中排队,由消费者来进行逐一的处理,就不会对应用产生过大对负载。

7.冗余备份

网站由于需要24小时地运转,但是请求过大或某些原因可能导致某台机器宕机,例如MySQL可能出现宕机的情况,那么就无法对外提供数据服务。

为了保证某台机器宕机后,系统仍能对外保持服务,此时的做法是做数据的冗余与备份,这样才可以在机器挂掉之后,迅速地启动其他机器提供服务。

例如微软为了防止地震或自然灾害的影响造成系统瘫痪,将数据服务器拆分成上千台放入深海之中,以便在任何突发情况下,都存在数据的备份。

8.自动化

对于一切应用来说,最理想的情况下是完全自动化的,例如代码是自动化部署更新的、测试是自动化测试、宕机后的机器切换也是自动化的、自动化的代码管理、接口出错可以自动化报警、请求量大可以自动化降级等等,这也是现在运维最新的发展方向。

9.安全

越大的网站越容易遭受黑客的攻击,例如XSS攻击、DDos攻击、CSRF攻击、SQL注入攻击等等,所以在特别需要保证安全的场景下,例如登陆、支付等场景需要引入验证码校验、请求签名校验等。

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

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

相关文章

基于PSO的无线传感器网络CH选择算法(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 CH(Contraction Hierarchies)算法是 Robert Geisberger、Peter Sanders、Dominik Schultes及Daniel Delling于2008年发布的&…

js中的类

1、构造函数与类 class Person{// 构造函数// 构造函数在调用类,实例化对象时调用constructor(name,age){console.log(构造器被调用了!);console.log(name,age);// 在构造函数中,this表示当前所创建的对象// this.name对象的属性&#xff0c…

简单说明芯片的启动过程和程序执行过程

目录 1.芯片启动过程 2.启动代码 2.1 堆栈定义 2.2 向量表 2.3 复位程序 2.4 中断服务程序 3. 程序执行的过程 4.数据的存取 1.芯片启动过程 芯片启动是上电后先运行芯片内部的固有程序(也就是启动代码)。启动代码程序建立完运行环境之后&#x…

微波基础介绍

1、什么是微波 大家在高中物理中都学过电磁波,可见光、微波都是电磁波波段,如下图所示,可见光谱只占有宽广的电磁波谱的一小部分: 而我们这次的主角微波,是频率范围300MHz到3THz的电磁波(1THz1000GHz&…

Clion结合CubeMX以Makefile编译和构建STM32以及OPENOCD调试嵌入式的优雅开发

目录 说在前面 Clion结合CubeMX以Makefile编译和构建STM32 新建目录和文件 串口打印问题解决,重定向fptuc失效. 说在前面 有稚晖君的一文,结果可能就让你对嵌入式开发更加易于上手。这是工具上的革新带给你的,这也是一个好的IDE带给开发人员不一样的优雅体验。…

〖Python网络爬虫实战㉗〗- Selenium案例实战(一)

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付…

C++ 从代码到可以执行的过程(预编译、编译、汇编、链接)(以Linux为参考)

参考阿秀的学习笔记 测试代码 #include<iostream> using namespace std; #define PI 3.14 int main(){//测试代码cout<<PI<<endl;cout<<"hello world"<<endl;return 0; }预处理 处理内容 删除define&#xff0c;展开所有宏定义处理…

羡慕大劳星空顶?不如跟我一起使用 Jetpack compose 绘制一个星空背景(带流星动画)

前言 背景 作为一个自诩的电影爱好者&#xff0c;经常会在半夜看电影&#xff0c;看完后就会顺道去豆瓣标记一下看过&#xff0c;再看看别人对这个电影的理解。 某日深夜&#xff0c;看完电影后&#xff0c;顺手打开了豆瓣的 书影音记录 这个功能&#xff0c;起初并没有注意…

c++虚函数详解(多态特性)

1.c多态的概念 多态是c的特征之一 多态的分类&#xff1a;静态多态&#xff08;静态联编&#xff09;、动态多态&#xff08;动态联编&#xff09; 静态多态&#xff08;静态联编&#xff09;&#xff1a;函数入口地址 是在 编译阶段 确定&#xff08;运算符重载、函数重载&…

微信小程序自定义tabBar

1.app.json中tabBar里设置 "custom":true 设置好后就可使用自定义tabBar。 注意&#xff1a;list中的页面必须保存&#xff0c;且必须和自定义的tabBar页面数据一致 "tabBar": {"custom": true,"list": [{"pagePath": &q…

基于springboot篮球论坛系统

开发技术介绍 B/S架构 随着软件系统的不断改进和升级&#xff0c;B/S结构产品更为方便的特征体现地十分明显。对于一个中等偏大的公司来说&#xff0c;如果系统管理员每天要在很多台电脑之间来回查看&#xff0c;不断奔走&#xff0c;那么效率和工作量就会变得很低&#xff0…

【Redis】Redis实现点赞、点赞排行榜

目录 一、点赞 1、思路 2、代码实现 二、点赞排行榜 1、思路 2、代码实现 一、点赞 1、思路 在我们的项目中我们有时候会碰到这样的需求&#xff0c;比如实现一个博客系统&#xff0c;当用户访问到这篇博客时可以进行点赞&#xff0c;那么这个功能如何去实现呢&#xff…

Midjourney|文心一格 Prompt:完整参数列表、风格汇总、文生图词典合集

Midjourney|文心一格 Prompt&#xff1a;完整参数列表、风格汇总、文生图词典合集 1.Midjourney 完整参数列表 参数名称 调用方法使用案例注意事项V5V4V3niji版本在关键词后加空格&#xff0c;然后带上版本参数&#xff1a; --v 或者 —v –version 或者 —versionvibrant cali…

【密码学复习】第八讲 数字签名

数字签名&#xff08;Digital Signature&#xff09;&#xff0c;也称电子签名&#xff0c;是指附加在某一电子文档中的一组特定的符号或代码&#xff0c;它是利用数学方法对该电子文档进行关键信息提取并与用户私有信息进行混合运算而形成的&#xff0c;用于标识签发者的身份以…

SpringBoot学习之集成Swagger3(二十七)

一、Maven配置 注意swagger的版本号是3.0.0版本以上才可以,这里我们就选择3.0.0版本 完整的Maven配置如下(仅供参考): <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaL…

vulnhub渗透测试靶场练习1

靶场介绍 靶场名&#xff1a;Medium_socialnetwork 下载地址&#xff1a;https://www.vulnhub.com/entry/boredhackerblog-social-network,454/ 环境搭建 靶机建议选择VM VirtualBox,我一开始尝试使用VMware时会报错&#xff0c;所以改用VM VirtualBox&#xff0c;攻击机使用…

魔改车钥匙实现远程控车:(前传)在macOS上安装使用Arduino

前言 因为最近有个需求需要硬件支持&#xff0c;原本打算使用 Arduino Nano&#xff0c;后来在 Boot 大佬的建议下&#xff0c;买了某宇宙家的 ESP32C3 核心板&#xff0c;对比 Arduino Nano 价格便宜了一大半&#xff0c;而且自身就集成了 WIFI 和 BLE 模块&#xff0c;还不用…

(一)before initialization of D3D(初始化D3D之前你需要了解的D3D基础知识)

什么是D3D? D3D全称Direct X 3D,即一组API可以用来针对GPU编程,不过他最主要的作用是用来渲染(不过现在也有很多其他应用比如d3d11va[Direct X 3D 11 Video API]用来进行硬件加速解码) Tips:Direct X 3D主要用来渲染,既然我们说到可以针对GPU编程了,当然不只是渲染的工作可以…

国考省考行测:数量关系,牛吃草问题,比例问题

国考省考行测&#xff1a;数量关系&#xff0c;牛吃草问题 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xff0c;我讲一起屡屡申论…

〖Python网络爬虫实战㉘〗- Selenium案例实战(二)

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…