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

news/2024/4/29 23:43:10/文章来源:https://blog.csdn.net/pbrlovejava/article/details/130725634

文章目录

      • 一.何谓模式
      • 二.通用架构模式
        • 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.luyixian.cn/news_show_302307.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​ NISP一级备考知识总结之信息安全概述、信息安全基础

参加每年的大学生网络安全精英赛通过初赛就可以嫖一张 nisp(国家信息安全水平考试) 一级证书,nisp 一级本身没啥考的价值,能白嫖自然很香 1.信息安全概述 信息与信息技术 信息概述 信息奠基人香农认为:信息是用来消…

在Ubuntu 22.04 LTS Jammy Linux 系统上安装MySQL

在Ubuntu 22.04 LTS Jammy Linux 系统上安装MySQL 1. Update Apt Package Index2. Install MySQL Server & client on Ubuntu 22.043. To Check the version4. Run the Security script to secure MySQL5. Login Database Server as the root user6. Manage MySQL service7…

mysql数据库的表约束

表的约束 5.1:表的约束的概念 定义: 数据库表约束是用于定义和实施数据完整性的规则或条件。它们被应用于数据库表中的列,以确保数据的一致性、有效性和准确性。表约束可以强制执行特定的规则,限制数据的插入、更新或删除操作&…

ESP32-C2系列开发板简介

C2是一个芯片采用4毫米x 4毫米封装,与272 kB内存。它运行框架,例如ESP-Jumpstart和ESP造雨者,同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统,受到了全球用户的信赖。它由支持Espressif以及所有…

python3 爬虫相关学习3:response= requests.get(url)的各种属性

目录 1 requests.get(url) 的各种属性,也就是response的各种属性 2 下面进行测试 2.1 response.text 1.2 response.content.decode() 1.2.1 response.content.decode() 或者 response.content.decode("utf-8") 1.2.2 response.content.decode(…

C++类和对象再探

文章目录 const成员再谈构造函数成员变量的定义函数体内赋值初始化列表 隐式类型转换explicitstatic成员 const成员 我们知道在调用类的成员函数时,会有一个默认的this指针且这个this指针时不可以被修改的,例如在日期类中,会有隐式的Date * const this;注意这里默认会在this前…

Flutter仿写微信导航栏快速实现页面导航

文章目录 前言使用TabBar实现TabBar介绍TabBar的重要属性说明TabBarView介绍TabBarView的重要属性TabBar总结TabBar实现底部导航的例子 BottomNavigationBar实现BottomNavigationBar介绍BottomNavigationBar实现底部导航栏的例子 总结BottomNavigationBarTabBar根据实际情况选择…

【Vue基础】Element案例学习-智能学习辅助系统

一、效果展示 初步设计一个系统&#xff0c;有目录、搜索栏、表格操作等。 二、参考代码 主要关注上图“App.vue”和“BtestView.vue”两个文件的代码 1、App.vue <template><div ><!-- <h1>{{ message }}</h1> --><!-- <element-view&…

暴涨700w播放,星穹铁道恰饭频频登上B站爆款热榜!

B站作为现在年轻一代聚集的多元化社区&#xff0c;游戏内容则是社区内受众较为广泛的存在&#xff0c;而星铁作为面向年轻群体的回合制游戏&#xff0c;自然是赢得B站核心用户群体的青睐。 4月26日&#xff0c;暌违已久的手游《崩坏&#xff1a;星穹铁道》&#xff08;后文简称…

JavaEE(系列6) -- 多线程(解决线程不安全系列1-- 加锁(synchronized)与volatile)

首先我们回顾一下上一章节引起线程不安全的原因 本质原因:线程在系统中的调度是无序的/随机的(抢占式执行) 1.抢占式执行 2.多个线程修改同一个变量. 一个线程修改一个变量>安全 多个线程读取同一个变量>安全 多个线程修改不同的变量>安全 3.修改操作,不是原子的.(最…

Python带你实现批量自动点赞小程序

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 所用知识点: 动态数据抓包 requests发送请求 json数据解析 开发环境: python 3.8 运行代码 pycharm 2022.3 辅助敲代码 requests 请求模块 &#xff0c;第三方&#xff0c;需安装 win R 输入cmd 输入安装命令 pip inst…

初步认识性能测试和完成一次完整的性能测试

上一篇博文主要通过两个例子让测试新手了解一下测试思想&#xff0c;和在做测试之前应该了解人几点&#xff0c;那么我们在如何完成一次完整的性能测试呢&#xff1f; 测试报告是一次完整性能测试的体现&#xff0c;所以&#xff0c;这里我给出一个完整的性能测试报告&#xff…

springBoot中使用redis实现分布式锁实例demo

首先 RedisLockUtils工具类 package com.example.demo.utils;import org.junit.platform.commons.util.StringUtils; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.red…

SAP入门到放弃系列之需求管理的基本要素

需求管理目标&#xff1a; 一般而言&#xff0c;生产计划&#xff08;PP&#xff09;的总体目标&#xff0c;特别是需求管理的总体目标是通过减少以下内容来更好地为客户服务&#xff1a; 补货提前期存货成本 需求管理的要素&#xff1a; 需求管理工作的主要要素广义上可分…

❤ cannot read properties of null(reading appendChild)解决办法

❤ 操作元素报&#xff1a;cannot read properties of null(reading appendChild)解决办法 1、场景&#xff1a; 写的一个js渲染&#xff0c;但是出了个小问题&#xff0c;cannot read properties of null(reading appendChild)报错。 <div id"divps" class&qu…

机器学习项目实战-能源利用率 Part-1(数据清洗)

1. 项目背景 2009年的《当地法案84号》&#xff0c;或纽约市基准法案&#xff0c;要求对能源和用水量进行年度基准测试和披露信息。被覆盖的财产包括单个建筑物的税收地块&#xff0c;其总建筑面积大于50,000平方英尺&#xff08;平方英尺&#xff09;&#xff0c;以及具有超过…

OpenAI新作Shap-e算法使用教程

一、知识点 Shap-e是基于nerf的开源生成3d模型方案。它是由如今热火朝天的Open AI公司&#xff08;chatgpt&#xff0c;Dell-E2&#xff09;开发、开源的。Shap-e生成的速度非常快&#xff0c;输入关键词即可生成简单模型&#xff08;限于简单单体模型&#xff09;。 二、环境…

别去外包,干了三年,废了....

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

jetson nx 用windows远程连接

VNC Viewer远程连接 一、jetson nx配置vnc 1、安装客户端 sudo apt-get install xrdp vnc4server xbase-clients2、进入nano/nx桌面&#xff0c;打开“Setting–>Desktop sharing”&#xff0c;没反应&#xff0c;据说是bug&#xff0c;我试过nano和nx都一样。首先输入下…

springboot+jsp法律知识分享网站普法平台

法律知识分享平台&#xff0c;主要的模块包括查看主页、个人中心、用户管理、律师事务所管理、律师管理、法律资讯管理、案例分析管理、案例分享管理、法规信息管理、法规分享管理、留言信息管理、留言回复管理、论坛管理、系统管理等功能。系统中管理员主要是为了安全有效地存…