
1) 【一句话结论】
采用分层高可用架构,通过Nginx负载均衡分散请求,应用层结合Redis缓存(含分布式锁、缓存策略)处理请求,数据库层采用读写分离+分库分表+异步写入,最终通过最终一致性保障数据一致性。
2) 【原理/概念讲解】
首先讲负载均衡:负载均衡器(如Nginx)作为请求入口,将高并发请求分发到多台应用服务器,避免单点故障。类比“交通枢纽”,Nginx像调度中心,把车辆(请求)分配到不同车道(应用服务器)。
接着讲缓存策略:Redis作为缓存层,缓存简历数据,大幅降低数据库压力。需处理三类问题:
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Nginx | 七层负载均衡器 | 支持HTTP/HTTPS,灵活配置(如轮询、IP哈希) | 高并发HTTP请求(如简历投递) | 需配置多节点,避免单点故障 |
| HAProxy | 四层/七层负载均衡 | 高性能,低延迟 | 对性能要求高的TCP/HTTP请求 | 配置复杂,需监控 |
| 缓存穿透 | 对不存在的key查询,返回空值 | 防止空值查询穿透数据库 | 热门数据查询 | 需缓存空值,避免重复查询 |
| 缓存击穿 | 热点key突然失效,大量请求到数据库 | 解决热点数据失效问题 | 热点数据查询 | 需分布式锁+互斥 |
| 缓存雪崩 | 大量key同时过期,数据库压力激增 | 解决缓存失效集中问题 | 缓存大量数据 | 需限流+随机过期时间 |
4) 【示例】
假设用户投递简历,请求路径:/submit_resume。流程:
resume:123),若存在,直接返回;伪代码(应用层):
def submit_resume(user_id, resume_data):
cache_key = f"resume:{user_id}"
if redis.get(cache_key):
return {"status": "success", "message": "数据已缓存"}
resume = db_from.read(user_id) # 从库读
if not resume:
return {"status": "error", "message": "简历不存在"}
db_master.write(user_id, resume_data) # 主库写(异步)
redis.set(cache_key, resume_data, expire=3600) # 写入缓存
return {"status": "success", "message": "简历投递成功"}
5) 【面试口播版答案】
“面试官您好,针对高并发简历投递场景,我设计的系统架构核心是分层高可用。首先负载均衡层用Nginx做四层/七层调度,轮询分发请求到多台应用服务器;应用层引入Redis缓存,处理简历数据,通过分布式锁解决缓存击穿,设置随机过期时间防雪崩;数据库层采用读写分离(主库写,从库读),并按学校分库分表,优化索引;同时简历数据写入数据库时通过消息队列异步处理,避免阻塞。数据一致性方面,采用最终一致性,通过缓存和数据库的同步机制(如更新缓存时同步数据库)保障,若需强一致性则引入补偿机制。”
6) 【追问清单】
7) 【常见坑/雷区】