高并发
高可用
海量数据
用户分布广泛,网络情况复杂
安全环境恶劣
需求快速变更,发布频繁
1.应用服务和数据服务分离
2.大量使用缓存改善网站性能(CDN加速、反向代理)
3.使用服务器集群改善网站并发能力
4.数据库读写分离
5.分布式文件(数据库)系统
6.NoSql与非数据查询技术(搜索引擎)
7.业务拆分(横向、纵向)
1.核心价值: 渐进式
2.主要动力: 业务发展
3.设计误区:
1.一味追求大公司的解决方案
2.为了技术而技术(不管是否适用,追求时髦,什么新用什么)
3。企图用技术解决所有问题(有时候好的业务架构要比技术架构更加重要)
1.性能问题是网站优化升级的触发器
2.前端常用优化方法:
浏览器缓存
页面压缩
合理布局
减少cookie传输
CDN
反向代理
3.后台常用优化方法:
服务器本地缓存
分布式缓存
消息队列
集群
数据库优化手段(索引、缓存、sql优化)
NoSql
1.主要问题:
服务器宕机
2.解决手段:
冗余备份
1.大型网站面临的问题:
高并发访问
海量数据存储
2.解决手段:
构建集群: 应用服务器集群、缓存服务器集群、数据库服务器集群
1.事件驱动架构
消息队列(观察者模式)
2.分布式服务
业务与可复用服务相分离(模块化)
防范各种攻击窃密手段
送发出请求到收到响应所经过的时间
单位时间同时处理请求数
单位时间处理请求数
描述服务器或操作系统性能的一系列数据指标
处理能力与并发数成正比
处理能力增长缓慢,达到最大负载点
处理能力反而下降,达到崩溃点
长时间不均匀地对系统施加压力
部署在网络运营商机房(网路第一跳)
1.将数据存储在较高访问速度的存储介质中
2.本质是一个 内存(读取速度快吗不是)Hash表(查询速度快吗不是)
1.不要缓存频繁修改的数据
2.要遵循二八定律,不要缓存低命中的数据
3.要注意 缓存的时效性 引起的问题
1.通过将缓存数据分布在集群中,当一台缓存服务器宕机时,从而防止全面更新缓存引起的性能消耗
2.对于已知的热点数据直接加载好(缓存预热),而不需使用LRU不断筛选预热
3.预防缓存穿透(攻击者不断请求某个不存在的数据,从而穿透缓存服务器,对数据库服务器造成极大的压力)
1.数据相同,同步更新(JBoss Cache)
2.Memcached:
简单的通讯协议(缓存客户端与缓存服务器)
丰富的客服端(支持多种语言)
高性能网络通信(支持事件触发)
高效内存管理(固定空间分配)
互不通信的服务器集群架构(客户端路由算法: 一致性Hash算法)(无限制线性伸缩)
1.用户的数据在发送给消息队列服务器后 立即返回
2.消息队列服务器 中的消费者进程从消协队列中获取数据异步写入数据库
3.达到了削峰作用(削平高峰时期的并发任务)
4.无法在返回时告知用户成功信息
1.将对象设计为无状态对象
2.使用局部对象
3.并发访问资源时使用锁
1.单例模式
2.对象池(减少对象创建删除引起的资源消耗)
1.硬件技术
2.存储结构技术
3.磁盘读写技术
网站可用时间占比(4个9)
数据服务的冗余备份和失效转移
应用层 => 负载均衡
服务层 => 负载均衡
数据层 => 冗余备份
1.使用负载均衡对无状态服务进行失效转移(心跳检测识别宕机服务器)
2.session管理
解决方案:
1.复制
2.绑定->原地址hash算法),一个客户端只会访问同一台服务器(session绑定技术)
3.cookie记录session(扯犊子)
4.session服务器:
利用独立部署的session服务器统一管理session
核心服务(功能)使用好的硬件,部署备份
负载均衡实现失败转移
异步消息队列
拒绝服务及关闭服务
对于特殊的业务场景设置其幂等
持久性: 不会丢失
可访问性: 失效转移
数据一致性: 所有副本一模一样
冷备份: 恢复到上一个保存点,啥也保证不了
热备份:
异步 => 主同从异
同步 => 主从同写
失效确认:
心跳检测
应用程序访问失败报告 => 收到报告后还需进行一次心跳检测,以免误报
访问转移:
重新路由
数据恢复:
宕机恢复后恢复数据
1.网站发布 => 部分宕机发布
2.自动化测试 => 自动化测试工具
3.预发布验证 => 预发布服务器(不接入负载均衡,外网无法访问)
4.代码管理 => git
5.自动化发布 => 火车发布模型
6.灰度发布 => 渐进式发布
1.不同功能进行物理分离实现伸缩
应用服务器 => 数据库分离 => 缓存分离 => 静态资源分离
还分为两种情况:
纵向: 从高级逻辑 到 底层调用
横向: 不同功能的横向解偶
2.单一功能通过集群实现伸缩
302 location 不利于SEO
多重负载均衡
请求转发
修改ip地址
不修改ip地址
轮询 加权轮询 随机 最少连接 源地址散列
就是一个 一致性hash算法
1.主从分离
2.数据分片/分区
sql + 数据一致性 => 高可用 + 可伸缩
1.扩展性指的是: 当系统增加新功能时,不需要对现有系统的结构和代码进行修改。
2.伸缩性指的是: 利用集群的方式增加服务器的数量、提高系统的整体事务吞吐能力。
通过模块分布式部署 以降低耦合性
1.操作系统中的生产者消费者模式 就是 典型的事件驱动架构
2.而在大型网站架构中, 分布式消息队列 就是 事件驱动架构的 一种具体实现手段
3.而消息队列 有利用 发布-订阅模式工作
为什么叫 消息队列 ? 先进先出
发布者 发布消息 消息队列未满 消息进入队列
订阅者 消息队列不为空 消息从队列中弹出
先进先出
优点:通过消息队列使系统具有更好的 响应延迟(因为发布者不需要等待订阅者处理数据就可以得到返回)
通过一个消息队列服务器 (服务器本地内存队列)实现
厉害在哪里?
1.伸缩性,直接在分布式集群中增加主机
2.可用性,
通过内存和磁盘的相互读写 解决了 内存队列大小限制 的问题
通过在 生产者服务器中 备份消息 解决了 消息队列服务器宕机 的问题
1.编译部署困难
2.代码分支管理困难
3.数据库连接耗尽
4.新增业务困难(可扩展性差)
1.纵向: 一个webapp变多个webapp
2.横向: 相同功能 模块化、分布化
1.负载均衡
2.失效转移
3.高效的远程通信
4.整合异构系统
5.对应用最少入侵(渐进式发展)
Sql => NoSql
就像开放的nodejs社区使nodejs在近几年得到了飞速的发展
类型: 反射性 持久性
解决方案: 消毒 HttpOnly
1.表单token: 通过每次提交时带上 服务器随机产生并放入response的token随机数,对用户的身份进行验证,而坏蛋是无法获取token的(同源策略)
2.验证码
3.referrer 字段
http 请求头首部的referer字段 表明了 请求的来源
同时也是 图片防盗链 的原理
不是自己网站的的请求获取不到图片
特点:
1. 不同长度 => 相同长度
2. 散列程度非常大
常见算法: MD5 SHA
加密解密一个密钥 => DES
特点:
1.公开密钥 + 私有密钥
2.一个加密 另外一个可以解密
应用场景:
1.信息安全传输
信息发送者(用户)通过 公开的(全世界都知道)的密钥 对明文进行加密 然后将密文传给 信息接收者(网站) 而只有接收者才有 私钥 所以只有接收者能看到明文的内容
2.数字签名
而数字签名与 安全传输 正好相反 发送者 用自己的 私钥 对明文的一小段进行加密然后随密文一起发送到服务器 因为私钥具有唯一性 所以能够标示用户的身份 具有签名的效用
1.文本匹配
正则表达式 => 多级Hash
2.分类算法
朴素贝叶斯算法
3.黑名单
Hash表 => 布隆过滤器
通过设定某些规则,对用户受骗的风险进行控制
(例如,qq异地登录)