[网络服务架构] 多级缓存分层架构
参考博客:https://www.cnblogs.com/xuwc/p/13699205.html
设想一个用户请求数据到返回的过程,数据会经过:
浏览器->CDN->代理服务器->应用服务器->数据库服务器,每个位置都可以使用缓存技术来提高响应速度,降低访问需求量。
例如:浏览器缓存的脱机网页文件、CDN缓存的分发资源、代理服务器缓存的静态资源、应用服务器缓存(进程缓存或缓存中间件)、数据库缓存(包括磁盘缓存等)。
缓存请求顺序是:HTTP缓存、CDN缓存、代理服务器缓存、进程缓存、分布式缓存、数据库
1.HTTP缓存
浏览器自行维护的缓存,当发出同一个请求的时候会根据缓存策略读取本地服务信息,如果找不到数据再请求服务器。
强制缓存
若本地有请求结果的缓存,那么直接使用缓存数据,通常会在HTTP Header中设置字段Expires和Cache-Control(结果缓存过期时间)。
对比缓存(实质上是交由服务端判断缓存是否过期)
首次请求时服务器除返回数据外,还记录数据的标识。
后续请求会携带这个数据标识,若服务端判断数据未变化,则返回状态码304并不携带报文体。
标识规则有:
1)Last-Modified/If-Modified-Since
即标识为资源最后修改时间,服务端对比请求给出的修改时间和本地资源的修改时间。
服务端返回Last-modified,客户端请求携带的字段是If-Modified-Since
2)ETag/If-None_Match
将服务器资源进行哈希计算得到哈希串作为ETag。
客户端下次请求会将ETag作为If-None-Match发送。
2.CDN缓存
即内容分发网络,其工作原理为:
a)客户端发送URL给DNS服务器
b)DNS解析完域名,将请求指向CDN网络中的DNS负载均衡器
c)负载均衡器将最近的CDN节点IP返回给DNS,DNS返回给客户端
d)客户端将CDN节点当作服务器地址进行请求
e)CDN从服务端获取资源并返回,同时缓存数据,若下次有相同请求则从缓存返回数据
CDN的作用为:
a)提高响应速度
b)进行负载均衡
c)进行资源缓存
注:HTTP缓存中提到的对比缓存可以在CDN服务器上对比判断
3.负载均衡缓存
负载均衡器在客户端和服务器之间,或者CDN和服务器之间。常见的是Nginx。
可以缓存一些静态信息。
4.进程内缓存
服务器中服务实例或其容器维护的缓存。
例如Java的JVM托管堆缓存。
在请求数据的时候会尝试读取进程内缓存,若未命中则去进程外缓存(系统缓冲区等)或分布式缓存搜索。
比较常见的架构有:Ehcache、GuavaCache、Caffeine,它们可以将热点数据方入进程内缓存。
进程内缓存适合只读数据和高并发需求场景(可以预先将数据存入内存以备使用)。
5.分布式缓存
进程外部的缓存,可以存在同一台物理主机上,也可以是分布在不同物理节点。其优势在于可以拥有更大的缓存容量,并且有专门的进程管理缓存更新、确保一致性以及节点崩溃后的缓存数据预加载。
典型的分布式缓存是多节点模型(哨兵、主从、集群等)下的redis。
浙公网安备 33010602011771号