摘要:本文主要是对《凤凰架构》的解读,讲述规划系统流量的几种方式。
本文分享自华为云社区《大流量时代,如何规划系统流量提升可靠性》,作者:breakDawn 。
对系统流量进行规划, 要注意以下2个原则
即对于某些资源, 在客户端就做缓存,客户端不去重复请求。
类似HTTP协议里在header里用到的两种标签,且都是服务端强行控制的,基于时间的
协商缓存需要考虑是否真的发生变化。 协商和强制可以共同存在,即强制失效的时候就可以用上协商。
协商缓存不仅存在于地址输入、跳转,也存在F5中(但如果Ctrl+F5强制刷新则会让缓存失效)
本章节大部分以熟知的HTTP协议作为主要传输通道协议,讲解如何进行优化
HTTP是基于TCP的,每次都是重新建立一个TCP连接。 因此前端开发人员开发了很多小优化,来减少请求次数,例如雪碧图、分段文档、合并Ajax请求之类的。
HTTP1.0里的长连接(keep-alive连接复用)为什么不能解决这个问题?
因为存在队首阻塞问题,本质上是基于FIFO复用连接, 1个请求卡住了,后面9个请求都阻塞住了,但如果同时支持返回,在顺序混乱的情况下无法正常处理
HTTP2.0的多路复用解决了这个问题:
HTTP很早就支持GZip压缩来减少大资源的传输量
HTTP1.0中, 持久连接和传输压缩无法一起使用, 因为压缩后无法识别资源是否传输完毕。
HTTP1.1中引入了“分块传输编码”,来进行资源结束的判断。
HTTP/3中,希望能替换掉HTTP on TCP的依赖、
谷歌推出了快速UDP网络连接, 即QUIC
CND可以解决 互联网系统跨运营商、跨地域物理距离所导致的时延问题,为网站流量带宽起到分流、减负的作用。
主要包含以下4个工作部分
用户的静态资源请求访问CDN是通过DNS解析来完成的,甚至可能一个网站会有各种不同地域的CDN域名解析地址返回, 通过你的路由配置会自动选择符合地域的ip地址
如何分发内容有两种方式:
如何更新资源有两种方式:
负载均衡有两种大类
缺点:
必须是同一个子网内,无法跨VLAN,只能作为最接近数据中心的均衡器
有两种方式:
IP隧道模式
均衡器在IP报文外面包了一层新的header,header里指定了目标机器的实际ip或者小网ip。 接收机器要支持解header,且同样要求作为返回的虚拟ip是一致的,也是直接返回无需经过均衡器。
缺点:
NAT模式
NAT模式中,就是进行真正的ip转换, 且返回时也要返回给NAT进行ip转换,这样只需要针对NAT进行人工管理即可。
缺点在于NAT容易成功性能瓶颈
SNAT会修改源IP改为NAT的ip, 可以做到对业务真正透明, 但是代价是如果需要对源IP做限制时容易有问题, 因为所有的来源ip都是一样的了。
也叫做七层代理(应用层代理),因为这个负载均衡属于反向代理(即部署在服务端的代理,对客户端不感知)
不适合做下载站、视频站等流量应用
如果瓶颈在服务计算能力,则可以考虑做应用层均衡
期
七层代理除负载均衡外的其他功能:
引入缓存的理由:
缓存需要选型,选型时需要根据实际场景选择你匹配的缓存熟悉
吞吐量
JDK8改进后的ConcurrentHashMap是并发场景下吞吐量最高的缓存容器,但除了吞吐量其他的能力就很弱了。
缓存状态更新思路:
命中率和淘汰策略
基础的三种淘汰方案:
为了解决上面2个缺点,有2个新的策略:
分布式能力
分布式缓存介绍了复制式缓存JbossCache以及集中式缓存Memcached。
jbosscache的缺点在于写入性能太差,容易因为网络同步速度跟不上写入速度,导致内存中积累过多待发对象引发omm
memcached是C语言实现的,好处在于读写性能高,缺点在于数据结构太过紧密,非常依赖序列化做跨语言传输,如果100个字段中的1个字段发生更新,要把100个字段都发出去更新
redis基本打败了各种分布式缓存,成为首选。
对于redis等分布式缓存, 是不会追求一致性C的
如果一定要一致性C, 那应该选用zk或者etcd等分布式协调框架(但他们一般就不会拿来做缓存,因为高并发下吞吐量太低,没有可用性)
进程内缓存和分布式缓存通常结合使用,但容易出现二者数据不一致,写维护策略导致缓存对开发者而言不透明。
一种设置原则是 变更以分布式缓存中的数据为主,访问以进程内缓存的数据优先。
大致做法是数据发生变动时, 在分布式缓存内推送通知, 让一级缓存失效。
访问缓存时,提供封装好的一二级联合查询接口, 让开发者对一二级缓存不感知。
缓存穿透
大量不存在的缓存打进来
要么是支持对不存在的数据缓存空值
要么是引入布隆过滤器
缓存击穿
同一时间瞬间涌现很多请求,访问数据库有但是缓存里没有的数据,此时可能直接打穿数据库(缓存生效是有延迟的)
可以是用锁、队列来完成同步
对于热点缓存,提前预处理或者配置策略
在大数据和 AI 的时代背景下,数据已经成为了重要财富,大到政务数据、企业核心数据,小到个人信息、银行卡余额,这些数据无一例外都是“隐私数据”,如果在使用和流转时发生泄漏都会造成巨大的损失。