大型网站架构之架构模式

2023-11-01

上节讲了大型网站的演变,今天讲下架构的模式,什么是模式呢?每一个模式描述了一个再我们周围不断重复发生的问题及问题解决方案的核心,这样你就能一次次重用该方案而不必去做重复的工作,可见模式的关键在于可重复性

 

网站架构模式的目标:面临高并发访问,海量数据处理,高可靠运行等问题和挑战,我们在实践中提出很多解决方案,主要为了实现网站的高性能、高可用、易伸缩、可扩展、安全等架构目标。

 

网站架构模式具体方案

 

分层:分层是一种常见的架构模式,将系统在横向维度上切分为几个部分,每个部分负责单一的职责,然后通过上层对下层的依赖和调用完成整个系统工作。一般大型网站系统都分为下面3层:

  • 应用层:负责具体业务和视图展示;

  • 服务层:为应用层提供服务支持;

  • 数据层:提供数据存储访问服务;

分层架构的挑战:必须合理规划层次边界和接口;

分层架构的约束:禁止跨层次调用及逆向调用(数据层不允许调用服务层,服务层不允许调用应用层)

 

分割分层是横向切分,分割则是纵向切分,将不同的功能和服务分割开,包装成高内聚低耦合的模块单元,这样做的好处在于:

  • 有助于软件开发和维护;

  • 便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力;

 

分布式:对于大型网站,分层和分割的目的都是为了便于分布式部署,将不同的模块部署在不同的服务器上,通过远程调用协同工作,分布式意味着我们可以使用更多的计算机完成同一个任务,计算机物理机越多,CPU,内存,存储资源就越多,能处理的并发访问和数据量也就更大,但是分布式也会带来一些问题:

  • 分布式服务意味着通过网络调用,会对性能造成影响;

  • 服务器越多,服务器宕机的概率就越大,使网站的可用性降低;

  • 数据在分布式环境下保持数据一致性也就比较困难;

  • 分布式下的事务也难以保证;

  • 分布式管理增了开发和维护的难度,切记不要为了分布式而分布式;

分布式的常见几种方案:

  • 分布式应用和服务:将分层和分割后的应用和服务模块分布式部署,可以改善网站性能和并发性,加快开发和发布的速度,减少数据库连接资源消耗,使不同的应用复用共同的服务,便于业务扩展;

  • 分布式静态资源:网站的静态资源例如js,css,图片等资源独立分布式部署,并采用独立的域名,即动静分离;静态资源分布式部署可以减轻应用服务器的负载压力,通过域名独立加快浏览器并发加载的速度;

  • 分布式数据和存储:大型网站需要处理以P为单位的海量数据,单台计算机无法提供如此大的存储空间,这些数据需要分布式存储;

  • 分布式计算:目前网站普遍使用Hadoop和MapReduce分布式计算框架进行批处理计算,其特点就是移动计算而不是移动数据,将计算程序分发到数据所在的位置,以加速计算和分布式计算;

  • 分布式配置:网站线上服务器配置实时更新;

  • 分布式锁:分布式环境下实现并发和协同工作;

  • 分布式文件:支持云存储的分布式文件系统;

 

 

集群:对于用户访问集中的模块,我们还需要考虑将其集群化,多台服务器部署相同应用构成一个集群,通过负载均衡器将请求分发给集群中不同的服务器处理。集群模式可以很好的扩展,当有更多用户访问时,只需要向集群中添加一台新的服务器加入集群即可,同时因为一个应用由多台服务器提供服务,当某台服务器发生故障时,负载均衡器或者系统的失效转移机制会将请求转发到集群中其他的服务器上,所以我们在配置集群时,至少需要2台以上服务器构成一个集群,目的就是为了提供系统的可用性

 

:将数据存放在距离计算最近的位置,加快处理速度。大型网站架构设计一般在下面几个方面使用缓存设计:

  • CDN:即内容分发网络,部署在距离终端用户最近的网络服务商,用户网络请求总是先到达他的网络服务商那里,在这里缓存一些静态资源,就可以以最快的速度返回资源给用户;

  • 反向代理:属于网站前端部分,部署在网站的前端,当用户请求到达网站的时候,最先访问到的就是反向代理服务器,这里缓存网站的静态资源,无需将请求继续转发给应用服务器就能直接返回给用户;

  • 本地缓存:在应用服务器本地缓存一些热点数据(段时间内经常被访问的数据),应用程序可以在本机内存中直接访问数据,而无需访问数据库;

  • 分布式缓存:将数据缓存在一个专门的分布式缓存集群中,应用程序通过网络通信获取缓存的数据;

使用缓存有2个前提条件:

  • 数据访问热点不均衡,某些数据会被更频繁的访问,这部分数据就该放入缓存;

  • 数据在某个时间段内有效,不会很快过期,否则缓存失效的数据就会因为失效而产生脏读,影响结果的正确性;

使用缓存的优势:加快数据访问速度以及减轻后端应用和数据存储的负载压力;

 

异步:大型网站的一个重要目标是降低软件的耦合性,系统解耦合的手段除了前面提到的分层、分割和分布式等,还有一个异步,业务之间的消息传递不是同步调用,而是将业务操作分成多个阶段,每个阶段之间通过共享数据的方式异步的进行协作;

  • 在单一服务器内部可以通过多线程共享内存队列的方式实现异步,业务前执行的线程将数据写入队列,后续线程从队列中读取数据进行处理;

  • 在分布式系统中,多个服务器集群通过分布式消息队列实现异步,分布式消息队列可以看做是内存队列的分布式部署;

异步架构是典型的生产者和消费者模式,此外异步消息队列还有如下特性

  • 提高系统可用性:消费者服务器宕机时,数据会堆积在消息队列中,生产者服务器可以继续处理业务请求,不影响系统整体运行,当消费者服务器恢复正常后可以继续处理消息队列中的数据;

  • 加快网站响应速度:处在业务处理前端的生产者服务器在处理完业务请求后,可以将数据写入消息队列,不需要等待结果直接返回,减少响应延迟;

  • 消除并发访问高峰:使用消息队列将突发的高峰访问请求数据放入消息队列中,等待消费者依次处理,不会对整个网站负载造成太大的压力;

 

冗余:网站需要24小时为用户提供服务,想要保证在服务器宕机的情况下,不影响网站的运行,不丢失数据,就需要将一定程度的服务器冗余运行,数据冗余备份,这样,当某台服务器宕机时,可以将其上面的服务和数据访问转移到其他冗余的服务器上。

数据库除了定期备份,存档保存,实现冷备份之外,为了保证在线业务高可用,还需要对数据库进行主从分离,实时同步实现热备份。

为了抵制一些非人为的天灾,一般还需要对整个网站数据中心进行备份,全球范围内部署灾备数据中心,网站程序和数据实时同步到多个灾备中心。

 

自动化:主要包括自动化代码管理、自动化测试、自动化安全检测、自动化部署等实现发布过程自动化;此外还需要对服务器进行自动化监控、自动化报警、自动化失效转移(将失效的服务器从集群中隔离出去)、自动化失效恢复(重启服务之后同步数据保证数据的一致性)、自动化降级(通过拒绝部分请求及关闭一些不重要的服务将系统负载降至一个安全的水平)以及自动化分配资源(将空闲资源分配给重要的服务,扩大部署规模)。

 

安全:主要从下面几点考虑

  • 通过密码手机校验码进行身份验证

  • 登录,交易等操作对网络通信进行加密

  • 防止机器人程序滥用网络资源攻击网站,使用验证码进行识别;

  • 对常见的XSS攻击、SQL注入进行编码转换等处理;

  • 对垃圾信息。敏感信息进行过滤

  • 对交易转账等重要操作根据交易模式和交易信息进行风险控制

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大型网站架构之架构模式 的相关文章

  • 内存分页

    内存分页 p Description 内存分页 p param records 待分页的数据 param pageNum 当前页码 param pageSize 每页显示的条数 return 分页之后的数据 public static

随机推荐

  • Git——C站最详细的Git教程,一篇学会Git(window\linux通用)

    Git C站最详细的Git教程 一篇学会Git window linux通用 文章目录 Git C站最详细的Git教程 一篇学会Git window linux通用 Git简介 Git 作用 为什么要进行源代码管理 Git的诞生 Git管理
  • vue双向数据绑定指令v-model

    vue双向数据绑定指令v model v model 被称为双向数据绑定指令 就是Vue实例对数据进行修改 页面会立即感知 相反页面对数据进行修改 Vue内部也会立即感知 v model 是vue中唯一实现双向数据绑定的指令 v bind
  • mybatis增删改查的写法集合

    增删改查的写法集合 注意 xml文件尽量不要注释 Usermapping public interface UserMapping 查询 List
  • mysql建_mysql简单建表

    NULL 和 NOT NULL 修饰符 可以在每个字段后面都加上这NULL 或 NOT NULL 修饰符来指定该字段是否可以为空 NULL 还是说必须填上数据 NOT NULL MySQL默认情况下指定字段为NULL修饰符 如果一个字段指定
  • 《Kafka系列》Java测试远程连接Kafka,实现生产者和消费者,发现两者数据不通?

    Java测试远程连接Kafka 实现生产者和消费者 发现两者数据不通 错误显示 错误排除 1 在网上看到有这种方法 修改Kafka下的conf下的server properties文件 cd opt apps kafka conf serv
  • Stream流

    概念 是JDK1 8的新语法 和IO流不是一个东西相当于流水线 很方便的对数据进行加工 Stream流把真正的函数式编程风格引入到Java中 代码简洁 Stream流不能直接修改数据源中的数据 不使用Stream流的优势是加工处理数据 每个
  • buuctf_Exec

    0x01 题目链接 BUUCTF在线评测BUUCTF 是一个 CTF 竞赛和训练平台 为各位 CTF 选手提供真实赛题在线复现等服务 https buuoj cn challenges 0x02 题目 打开题目就看到大大的PING 二话不说
  • 在存储过程中使用了DML语句要不要调用COMMIT?

    要调用commit语句 或者正常退出sqlplus 系统会自动提交 dml语句不能自动提交 ddl语句和dcl语句可以自动提交 转自 http bbs csdn net topics 80160481
  • 胶囊体阴影

    官方介绍 虚幻引擎现在支持非常柔滑的间接阴影 由代表角色的胶囊体来进行投影 通常 在受间接光照时 并不会产生阴影 除非是屏幕空间环境遮罩 间接投影需要做的非常柔滑 因为间接光照是来自很多不同的方向 因此 传统的阴影贴图做法的效果并不好 间接
  • android windows 安装

    转自 http www cnblogs com skynet archive 2010 04 12 1709892 html 本系列适合0基础的人员 因为我就是从0开始的 此系列记录我步入Android开发的一些经验分享 望与君共勉 作为A
  • 安防监控视频云存储平台EasyNVR通道频繁离线的原因排查与解决

    安防视频监控汇聚EasyNVR视频集中存储平台 是基于RTSP Onvif协议的安防视频平台 可支持将接入的视频流进行全平台 全终端分发 分发的视频流包括RTSP RTMP HTTP FLV WS FLV HLS WebRTC等格式 为了满
  • MATLAB神经网络编程(四)——线性神经网络的实现与局限

    MATLAB神经网络编程 化学工业出版社 读书笔记 第四章 前向型神经网络 4 2 线性神经网络 本文是 MATLAB神经网络编程 书籍的阅读笔记 其中涉及的源码 公式 原理都来自此书 若有不理解之处请参阅原书 一 线性神经网络的实现 线性
  • vue 中 elementui Dropdown 下拉菜单中 选项的click事件

  • gcc/g++交叉编译*.c/*.cpp程序时的配置

    CFLAGS I PWD src CFLAGS I third party hisi include CFLAGS L third party hisi lib CXXFLAGS I PWD src CXXFLAGS I third par
  • 电脑网络故障:LSP造成?

    问题 1 什么是LSP 删除了什么才导致了不能上网 LSP 为什么能影响网络 其内部的原理机制是什么 网络连接正常但无法上网 能ping通外网DNS 解决方法 2013 11 03 00 47 17 转载 标签 辅助工具 在线聊天 解决方法
  • java 阻塞模式与非阻塞模式

    TCP IP 阻塞模式与非阻塞模式 java view plain copy print package concurrentTest import java io BufferedReader import java io IOExcep
  • warning:Deprecated declaration LaberPwmSel_High - give arg types解决方法

    有些小伙伴在编译代码的时候偶尔会遇到这样的警告 当然这对整体并没有什么影响 直接忽略也是ok的 警告的大概意思是 LaberPwmSel High 应该提供类型声明 也就是说 使用MDK编译器的时候 如果函数在定义时没有传参 要在括号中加v
  • css禁止滑动页面_css页面滑动穿透的两种解决办法

    这篇文章主要介绍了css如何防止页面滑动穿透 小编觉得挺不错的 现在分享给大家 也给大家做个参考 一起跟随小编过来看看吧 问题描述 移动端当有 fixed 遮罩背景和弹出层时 在屏幕上滑动能够滑动背景下面的内容 这就是著名的滚动穿透问题 示
  • java实现----sql解析器

    更新中 首先我们项目要编写一个小型的dbms 所以我负责编写的sql解析的部分 所以本文只是记录我学习和编写sql解析器的过程
  • 大型网站架构之架构模式

    上节讲了大型网站的演变 今天讲下架构的模式 什么是模式呢 每一个模式描述了一个再我们周围不断重复发生的问题及问题解决方案的核心 这样你就能一次次重用该方案而不必去做重复的工作 可见模式的关键在于可重复性 网站架构模式的目标 面临高并发访问