C++ 全栈知识体系C++ 全栈知识体系
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
✿导航
  • 基础
  • 函数
  • 知识点
  • IO框架
  • 新版本特性
  • 数据库原理
  • SQL语言
  • SQL - MySQL
  • NoSQL - Redis
  • NoSQL - ElasticSearch
  • 算法基础
  • 常见算法
  • 领域算法
  • 分布式算法
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • 计算机组成
  • 开发
  • 测试
  • 架构基础
  • 分布式系统
  • 微服务
  • 中间件
  • 概念
  • 理论
  • 架构设计原则
  • 设计模式
  • 协议
  • 技术选型
  • 编码规范
  • 流水线构建 - CI/CD
  • 知识点 - Linux
  • 网站 - Nginx
  • 容器化 - Docker
  • 容器编排 - Kubernetes
  • 服务网格 - Service Mesh Istio
  • 常用快捷键 - Shortcut
  • 工具使用 - Tools
  • 开源项目
  • 学习项目
  • 个人项目
  • 项目开发
  • 项目Idea
  • 并发
  • 部署
  • 分布式
  • 知识
  • 问题
  • 编程语言与技术
  • 系统与架构
  • 软件开发实践
  • 数据处理与应用设计
  • 个人
  • 产品
  • 团队
  • 知识体系
  • Vue
关于
  • 编程语言与技术

    • Effective C++: 改善程序与设计的55个具体做法

      • 第2章 - 构造/析构/赋值运算(一)
      • 第2章 - 构造/析构/赋值运算(二)
      • 第2章 - 构造/析构/赋值运算(三)
      • 第3章 - 资源管理
      • 第4章 - 设计与声明(一)
      • 第4章 - 设计与声明(二)
      • 第5章 - 实现(一)
      • 第5章 - 实现(二)
      • 第6章 - 继承与面向对象设计
      • 第7章 - 模板与泛型编程
    • 深度探索C++对象模型

      • 第1章 - 关于对象
      • 第2章 - 构造函数语意学
      • 第3章 - Data 语意学
    • STL源码剖析

      • 第1章 - STL概论和版本简介
      • 第2章 - 空间配置器
      • 第3章 - 迭代器(iterators)概念与traits编程技法(一)
      • 第3章 - 迭代器(iterators)概念与traits编程技法(二)
      • 第4章 - 序列式容器 vector
      • 第4章 - 序列式容器 list
      • 第4章 - 序列式容器 deque
      • 第4章 - 序列式容器 stack和queue
      • 第4章 - 序列式容器 heap
      • 第4章 - 序列式容器 priority_queue
      • 第4章 - 序列式容器 slist
      • 第5章 - 关联式容器 RB-tree
      • 第5章 - 关联式容器 set和map
      • 第5章 - 关联式容器 hashtable
      • 第6章 - 算法
      • 第6章 - 算法之set
      • 第7章 - 仿函数
      • 第8章 - 配接器
  • 系统与架构

    • 深入理解计算机系统

      • 第1章 - 计算机系统漫游
      • 第2章 - 信息的表示和处理
      • 第3章 - 程序的机器级表示
      • 第5章 - 优化程序性能
      • 第6章 - 存储器层次结构
      • 第7章 - 链接
      • 第8章 - 异常控制流
      • 第9章 - 虚拟内存
      • 第10章 - 系统级I/O
      • 第11章 - 网络编程
      • 第12章 - 并发编程
    • 大型网站技术架构——核心原理与案例分析

      • 第1章 - 大型网站架构演化
      • 第2章 - 大型网站架构模式
      • 第3章 - 大型网站核心架构要素
      • 第4章 - 瞬时响应:网站的高性能架构
      • 第5章 - 万无一失:网站的高可用架构
      • 第6章 - 永无止境:网站的伸缩性架构
      • 第7章 - 随需应变:网站的可扩展架构
      • 第8章 - 固若金汤:网站的安全架构
    • 从零开始学架构

      • 架构基础
      • 架构设计原则
      • 高性能架构
      • 高可用架构
    • 程序员的自我修养————链接、装载与库

      • 第1章 - 简介
      • 第2章 - 静态链路
      • 第3章 - 目标文件里有什么
      • 第4章 - 静态链接
      • 第7章 - 动态链接
      • 第8章 - 共享库版本
      • 第10章 - 内存
      • 第11章 - 运行库
      • 第12章 - 系统调用与API
      • 第13章 - 运行库实现
  • 软件开发实践

    • 重构改善既有代码的设计

      • 第1章 - 重构,第一个示例
      • 第2章 - 重构的原则
      • 第3章 - 代码的坏味道
      • 第5章 - 重构列表
      • 第6章 - 重新组织函数
      • 第7章 - 在对象之间搬移特性
      • 第8章 - 重新组织数据
      • 第9章 - 简化条件表达式
      • 第10章 - 简化函数调用
      • 第11章 - 处理概括关系
      • 第12章 - 设计之大型重构
    • 代码大全2

      • 第1章 - 欢迎进入软件构建的世界
      • 第2章 - 用隐喻来更充分地理解软件开发
      • 第3章 - 三思而后行: 前期准备
      • 第4章 - 关键的构建决策
      • 第5章 - 软件构建中的设计
    • Linux多线程服务端编程——使用muduo C++ 网络库

      • Buffer类的设计
      • 设计与实现
      • 定时器与TimerQueue
      • Protobuf网络传输和Protobuf编解码器与消息分发器
      • EventLoop类剖析
      • EventLoopThread和EventLoopThreadPool剖析
      • TCP网络库和核心类
      • Connector剖析
      • TcpClient剖析
      • 学习总结
      • timing wheel
      • 消息广播服务
      • 线程安全的对象生命期管理
  • 数据处理与应用设计

    • 数据密集型应用系统设计

      • 第1章 - 可靠、可扩展与可维护的应用系统
      • 第2章 - 数据模型与查询语言
      • 第3章 - 数据存储与检索
      • 第4章 - 数据编码与演化
      • 第5章 - 数据复制
      • 第6章 - 数据分区
      • 第7章 - 事务

第2章:大型网站架构模式

  • 分层
  • 分割
  • 分布式
  • 集群
  • 缓存
  • 异步
  • 冗余
  • 自动化
  • 安全

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

网站架构模式

分层

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

一般大型网站系统都分为下面3层:

  • 应用层:负责具体业务和视图展示;
  • 服务层:为应用层提供服务支持;
  • 数据层:提供数据存储访问服务;

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

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

分割

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

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

分布式

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

  • 分布式服务间通过网络调用,会对性能造成影响;
  • 服务器越多,服务器宕机的概率就越大,使网站的可用性降低 ———— 可以通过同类型服务器,负载均衡方式解决;
  • 分布式数据一致性问题;
  • 分布式下事务问题;
  • 分布式管理增了开发和维护的难度————切记不要为了分布式而分布式;

分布式的常见几种方案:

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

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

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

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

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

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

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

集群

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

缓存

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

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

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

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

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

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

  • 数据访问热点不均衡,某些数据会被更频繁的访问,这部分数据就该放入缓存;
  • 数据在某个时间段内有效,不会很快过期,否则缓存失效的数据就会因为失效而产生脏读,影响结果的正确性;

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

异步

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

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

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

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

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

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

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

冗余

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

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

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

自动化

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

安全

主要从下面几点考虑

  1. 通过密码和手机校验码进行身份验证;
  2. 登录,交易等操作对网络通信进行加密;
  3. 防止机器人程序滥用网络资源攻击网站,使用验证码进行识别;
  4. 对常见的XSS攻击、SQL注入进行编码转换等处理;
  5. 对垃圾信息、敏感信息进行过滤;
  6. 对交易转账等重要操作根据交易模式和交易信息进行风险控制;

文章来源

  • 作者:李智慧
  • 来源:《大型网站技术架构》
Last Updated:
Contributors: klc407073648
Prev
第1章 - 大型网站架构演化
Next
第3章 - 大型网站核心架构要素