第四章:透明多级分流系统
一、客户端缓存
核心目标:减少重复请求,降低服务端压力。
1. 强制缓存
- 定义:客户端直接根据缓存规则决定是否使用本地缓存,无需与服务端交互。
- 关键HTTP头:
Cache-Control
:优先级最高,如max-age=3600
(缓存1小时)。Expires
:绝对时间戳(HTTP/1.0遗留字段)。
- 缓存策略:
- 资源未过期时直接使用本地缓存(状态码200,标记为
from cache
)。 - 资源过期后重新请求服务端。
- 资源未过期时直接使用本地缓存(状态码200,标记为
2. 协商缓存
- 定义:客户端需携带验证信息(如时间戳、哈希值)到服务端,由服务端决定是否使用缓存。
- 关键HTTP头:
Last-Modified
(服务端返回)与If-Modified-Since
(客户端发送):基于时间戳验证。ETag
(服务端返回)与If-None-Match
(客户端发送):基于哈希值验证。
- 状态码:若资源未修改,返回
304 Not Modified
,客户端使用本地缓存。
难点:
- 强制缓存与协商缓存的优先级关系(强制缓存优先)。
ETag
的生成算法对性能的影响(如使用强校验还是弱校验)。
二、域名解析(DNS)
核心目标:将域名映射为IP地址,实现流量初步分流。
1. DNS解析流程
- 浏览器缓存 → 本地Host文件 → 本地DNS服务器 → 根DNS → 权威DNS。
- 递归查询与迭代查询的区别。
2. DNS负载均衡
- 轮询策略:将同一域名解析为多个IP地址,实现简单负载均衡。
- 智能DNS:基于地理位置、网络质量动态返回最优IP。
3. 安全问题
- DNS劫持:篡改解析结果,需通过HTTPS或DNS over HTTPS(DoH)防范。
- TTL设置:过短的TTL增加DNS查询压力,过长的TTL降低灵活性。
三、传输链路优化
核心目标:提升网络传输效率与可靠性。
1. 连接数优化
- HTTP/1.1 Keep-Alive:复用TCP连接,减少握手开销。
- HTTP/2多路复用:单连接上并行传输多个请求,解决队头阻塞问题。
- HTTP/3 QUIC:基于UDP,解决TCP队头阻塞,支持0-RTT握手。
2. 传输压缩
- 内容编码:
gzip
、brotli
等算法压缩响应体。 - 传输编码:分块传输(
Transfer-Encoding: chunked
)支持流式传输。 - 头部压缩:HTTP/2使用HPACK算法压缩头部字段。
3. QUIC协议优势
- 0-RTT连接建立:减少握手延迟。
- 前向纠错(FEC):降低数据包重传概率。
- 连接迁移:IP变化时仍保持连接(适用于移动端)。
四、内容分发网络(CDN)
核心目标:将资源缓存到边缘节点,就近响应用户请求。
1. CDN路由解析
- DNS调度:根据用户IP返回最近的边缘节点IP。
- Anycast技术:同一IP地址广播到多个节点,路由选择最优路径。
2. 缓存策略
- 缓存预热:提前将资源推送到CDN节点。
- 缓存淘汰:基于LRU、TTL等算法更新资源。
- 动态内容加速:通过边缘计算处理动态请求(如API Gateway)。
3. CDN应用场景
- 静态资源加速:图片、CSS、JavaScript等。
- 流媒体分发:视频切片(HLS/DASH)、直播推流。
- 安全防护:DDoS防御、WAF集成。
五、负载均衡
核心目标:将请求分发到多个服务实例,提升系统吞吐与可用性。
1. 负载均衡层级
- 四层(L4):基于IP+端口(如Nginx的
stream
模块)。 - 七层(L7):基于HTTP头部、URL路径(如Nginx的
http
模块)。
2. 负载均衡算法
- 轮询(Round Robin):简单轮转,适用于实例性能均等。
- 加权轮询(Weighted RR):根据实例权重分配流量。
- 最少连接(Least Connections):优先选择连接数少的实例。
- 一致性哈希:相同请求路由到固定实例,适合有状态服务。
3. 会话保持(Session Affinity)
- Cookie注入:在响应中插入会话标识(如
JSESSIONID
)。 - IP哈希:基于客户端IP计算哈希值,固定路由。
六、服务端缓存
核心目标:减少数据库或计算密集型操作的压力。
1. 缓存分类
- 本地缓存:如Guava Cache、Caffeine(单机使用,无一致性保证)。
- 分布式缓存:如Redis、Memcached(多节点共享,需解决一致性)。
2. 缓存策略
- 过期策略:
- TTL(Time-To-Live):固定时间后失效。
- 惰性过期:访问时检查是否过期。
- 定期清理:后台线程扫描过期键。
- 淘汰策略:LRU、LFU、FIFO等。
3. 缓存问题与解决方案
- 缓存穿透:大量请求不存在的Key → 布隆过滤器拦截非法请求。
- 缓存雪崩:大量Key同时失效 → 随机化TTL或熔断降级。
- 缓存击穿:热点Key失效 → 互斥锁(如Redis的
SETNX
)或永不过期。
七、总结与设计要点
- 多级分流协同:客户端缓存 → CDN → 负载均衡 → 服务端缓存,逐级减少请求压力。
- 性能与一致性的权衡:缓存时间越长,性能越好,但可能牺牲数据一致性。
- 动态内容处理:边缘计算(如CDN的Lambda@Edge)支持动态请求加速。
- 协议选择:HTTP/2/3的普及对连接管理和传输效率有显著提升。
- 容灾设计:DNS故障切换、负载均衡健康检查、缓存降级策略。
多选题
一、客户端缓存相关
关于协商缓存机制的描述,正确的是:
A. 通过Cache-Control: max-age=3600
控制
B. 使用ETag
和Last-Modified
验证资源新鲜度
C. 响应状态码为200 (from cache)
时触发
D. 需要服务器验证资源是否过期
答案:B、D
解析:协商缓存通过ETag
/Last-Modified
与服务端验证资源是否更新,状态码为304 Not Modified
。Cache-Control
属于强制缓存,200 (from cache)
是强制缓存命中。强制缓存可能导致的问题包括:
A. 客户端无法及时获取更新后的资源
B. 服务器负载增加
C. 浏览器重复发送验证请求
D. CDN边缘节点缓存过期不一致
答案:A、D
解析:强制缓存跳过服务端验证,可能导致客户端资源过期(A)。CDN节点缓存时间不一致会导致用户获取不同版本资源(D)。B错误(强制缓存减少服务端负载),C是协商缓存的特点。
二、域名解析与传输链路
DNS负载均衡的局限性包括:
A. 无法感知后端服务器的实时状态
B. 不支持基于地理位置的解析
C. 仅支持A记录类型
D. DNS记录TTL影响灵活性
答案:A、D
解析:DNS负载均衡无法动态感知服务器状态(A),且TTL过长会导致解析延迟(D)。B错误(支持地理位置解析),C错误(支持CNAME、SRV等)。关于QUIC协议,正确的说法是:
A. 基于TCP实现可靠传输
B. 默认启用TLS 1.3加密
C. 解决队头阻塞问题
D. 握手延迟低于HTTP/2
答案:B、C、D
解析:QUIC基于UDP(A错误),默认加密(B),多路复用无队头阻塞(C),0-RTT握手降低延迟(D)。
三、CDN与负载均衡
CDN路由解析可能采用的技术包括:
A. DNS解析返回最优边缘节点IP
B. Anycast IP地址广播
C. HTTP重定向到最近节点
D. 客户端IP地理数据库匹配
答案:A、B、C
解析:DNS解析(A)、Anycast(B)、HTTP 302重定向(C)均为CDN路由策略。D是客户端自主行为,非CDN实现。应用层负载均衡(如Nginx)的优势包括:
A. 支持基于HTTP头的路由规则
B. 可解析SSL/TLS加密流量
C. 高性能,仅依赖IP和端口转发
D. 实现会话保持(Session Persistence)
答案:A、B、D
解析:应用层负载均衡可解析HTTP头(A)、解密SSL(B)、会话保持(D)。C是网络层负载均衡的特点。
四、服务端缓存与风险
缓存击穿的解决方案包括:
A. 设置随机过期时间
B. 使用互斥锁(Mutex Lock)重建缓存
C. 布隆过滤器拦截无效查询
D. 缓存空值(Null Object)
答案:B、D
解析:缓存击穿指热点key失效后高并发请求穿透到DB。互斥锁(B)和缓存空值(D)可缓解。A是缓存雪崩方案,C是缓存穿透方案。关于缓存一致性的描述,正确的是:
A. 强一致性可通过同步更新DB和缓存实现
B. 最终一致性模型中可能存在短暂脏数据
C. 写穿透(Write-Through)策略优先更新缓存
D. 延迟双删策略可解决并发写问题
答案:A、B、C
解析:强一致性需同步更新(A),最终一致性允许短暂不一致(B),写穿透先更新缓存(C)。D错误(延迟双删解决缓存失效后重建问题)。
五、综合设计
设计高可用传输链路时,必要的措施包括:
A. 启用HTTP/2多路复用减少连接数
B. 使用Brotli压缩替代Gzip
C. 配置TCP Fast Open(TFO)
D. 开启TLS会话恢复(Session Resumption)
答案:A、C、D
解析:HTTP/2多路复用(A)、TFO减少握手(C)、TLS会话恢复(D)提升性能。B是可选项,非必要。在微服务架构中,服务端缓存设计需考虑:
A. 分布式锁实现原子性操作
B. 缓存分区避免单点故障
C. 本地缓存与远程缓存的多级分层
D. 使用一致性哈希均衡负载
答案:A、B、C、D
解析:分布式锁(A)、缓存分区(B)、多级缓存(C)、一致性哈希(D)均为微服务缓存设计要点。
答案与解析总结
- 客户端缓存:区分强制缓存(状态码200)与协商缓存(304),ETag/Last-Modified用于验证。
- 域名解析:DNS负载均衡依赖TTL和记录类型,无法动态感知服务器状态。
- 传输链路:QUIC基于UDP,解决队头阻塞,0-RTT握手;HTTP/2多路复用减少连接数。
- CDN:路由策略包括DNS、Anycast、HTTP重定向;负载均衡需考虑应用层规则。
- 服务端缓存:缓存击穿(互斥锁)、雪崩(随机过期)、穿透(布隆过滤器);一致性模型需权衡强一致与最终一致。
- 系统设计:多级缓存、分布式锁、一致性哈希是微服务缓存核心设计模式。
通过以上题目可全面覆盖第四章的核心技术点,重点考察对缓存策略、传输协议、负载均衡机制及分布式系统设计原则的理解深度。