性能
浏览器端
- 浏览器缓存、页面压缩、合理布局页面、减少Cookie传输
- CDN,将网站静态内容分发至离用户最近的网络服务器机房,使用户通过最短的访问路径获取数据。
- 反向代理隐藏了实际的服务端,当我们请求baidu的时候,该反向代理服务器就会将请求发送给实际处理请求的服务器。nginx就是这种原理实现的反向代理的**负载均衡服务器。**
- 可以在机房部署反向代理服务器,缓存热点文件、数据等,加快请求响应速度
应用服务器端
- 缓存
- 本地缓存:像微博,会讲所有的热点数据(如明星用户的微博或者热门微博)缓存到每一台服务器中,这样用户直接可以最快获取到,减少了RPC请求和IO的消耗。
- 将最经常访问的数据放入本地缓存是最有效的。
- 分布式缓存:在线用户的微博和近期微博缓存在分布式缓存集群中。
- 高可用的分布式缓存架构,保证获取缓存的高可用。
- 刷微博其实就是一起请求缓存的过程。
- 本地缓存:像微博,会讲所有的热点数据(如明星用户的微博或者热门微博)缓存到每一台服务器中,这样用户直接可以最快获取到,减少了RPC请求和IO的消耗。
- 异步MQ
- 应用服务器集群
代码层面
- 多线程,对象作用域合理定义,JVM内存管理等
数据库端
- 索引、缓存、sql优化
网站的监控
- 接口响应时间
- TPS
- 系统性能监控
高可用性
就两个字:冗余,如果某一个服务器或者一个功能异常了,应该也是可以使用的。
在用户层面是无感知的。
- 应用服务器集群部署,通过负载均衡策略来请求到具体的某一台服务器
- 缓存服务器集群部署
- 多数据中心、灾备中心,定期备份重要数据,防止火灾,自然灾害带来的数据丢失等。
伸缩性
伸:是指在通过不断的向服务器集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增长的数据存储需求。
缩:当集群中服务器出现异常,是否可以将其无感知的从集群中移除。
衡量标准:加减服务器是否可以提供和原来无差别的服务水平。
应用服务器的伸缩策略
是无状态的,也就是不保存数据的,所以可以通过负载均衡策略(路由实现)实现服务器的加减
缓存服务器集群
加入新的服务器可能会导致缓存路由失效,进而导致集群中的大部分缓存失效无法访问。
虽然缓存的数据可以通过数据库重新加载,但是严重依赖缓存的服务可能会完全崩溃。
使用合理的路由访问策略很重要!!!
一致性hash路由算法
一致性hash算法主要应用在分布式缓存系统中,在增加或者删除服务器节点时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系,也就是系统中的大多数历史缓存的存储服务器节点可以不变,解决了普通hash算法带来的动态伸缩性问题。
一致性hash定义了一个 0 ~ 2^32-1 hash环,然后根据需要缓存的Key来找到其hash值,范围是[0,2^32-1],在hash环上顺时针找到距离这个Key hash最近的服务器节点,如下图所示
新增节点E (25000),按照一致性hash算法,只有B ~ E 之间的历史数据会受到影响,(之前是路由到C的,现在路由到 E ),即只有C的一部分数据需要迁移到E。
删除节点B,那么 A~ B 之间的历史数据丢失,并且新增数据会被插入到 C,其他的节点都不会受到影响。
可以看到一致性hash算法,节点的增删都只会影响了系统中的一小部分数据,容错性非常好。
但是上面的模型还是有个问题,如果服务器节点太少或者出现热点数据,就会导致服务器节点上之间的数据分布不均匀;并且还可能出现缓存雪崩的问题。
虚拟节点解决增删节点带来的负载不均衡问题
一致性hash 通过引入虚拟节点解决了这个问题,每个实际节点映射多个虚拟节点,数据按照规则找到虚拟节点后,再储存到映射的实际节点上;因为虚拟节点可以在hash环上均匀分布,这意味着当一个真实节点失效退出后,它原来所承载的压力将会均匀地分散到其他节点上去,解决缓存雪崩问题
扩展性
分布式服务:
- 动态增减服务,对用户无感知;
- 服务之间解耦合,通过RPC dubbo之间进行调用。
- 失效转移:当某个服务不可用时,切换到其他服务器实力上。
MQ:服务之间的解耦合利器。
代码扩展性:多态、抽象代码、封装代码,好的设计使得代码扩展性强