
针对双11简历投递超100万请求导致的系统响应缓慢,核心方案是通过微服务解耦(拆分简历接收、处理、存储服务)、Redis缓存+数据库读写分离(主写从读)+Kafka异步消息队列,结合负载均衡与熔断降级,实现高并发下的系统稳定与快速响应,确保前端响应速度和后端处理能力。
老师口吻解释关键概念:
apply:user_id:timestamp),缓存热点数据(如用户投递状态),减少数据库查询。设置合理过期时间(如1小时),依据业务数据更新频率(简历投递状态变化慢),避免缓存雪崩。| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 微服务拆分 | 将系统拆为独立服务,职责单一 | 解耦、可扩展、独立部署 | 复杂系统,业务模块多 | 服务间通信成本、分布式事务 |
| 数据库读写分离 | 主库写、从库读,通过中间件实现 | 分担主库压力、提升读性能 | 高并发写场景 | 从库数据延迟、主从同步问题 |
| Redis缓存 | 内存键值存储,支持数据缓存 | 高速读写、数据结构丰富 | 热点数据读取 | 缓存击穿/雪崩/过期问题 |
| 消息队列(Kafka) | 分布式消息系统,异步通信 | 高吞吐、持久化、可扩展 | 解耦系统、异步处理、削峰 | 消息积压、消费者延迟 |
| 幂等性设计 | 防止重复操作导致数据异常 | 确保操作结果唯一 | 高并发场景(如投递简历) | 需结合缓存或数据库唯一约束 |
POST /apply)→ Nginx负载均衡 → 简历接收服务。key=apply:user_id:timestamp):
resume,字段:user_id, resume_content, apply_time)。# 简历接收服务伪代码
def apply_resume(request):
user_id = request.user.id
# 幂等性检查:Redis SETNX加锁
if redis.setnx(f"apply:{user_id}:{request.timestamp}", user_id, ex=3600):
# 查询从库
if db.read_from_slave(user_id):
redis.set(f"apply:{user_id}:{request.timestamp}", user_id, ex=3600)
return {"code": 200, "msg": "已投递"}
# 推入Kafka
kafka_producer.send("resume-apply", value=request.json)
return {"code": 201, "msg": "投递成功,正在处理"}
else:
return {"code": 200, "msg": "已投递"}
(数据库读写分离配置:主库(写操作),从库(读操作),中间件ShardingSphere-Proxy实现路由。)
“面试官您好,针对双11简历投递超100万请求导致系统响应缓慢的问题,我的方案核心是通过微服务拆分、Redis缓存+数据库读写分离、Kafka消息队列,结合负载均衡和熔断降级,实现高并发下的系统稳定与快速响应。首先,架构上拆分为‘简历接收’‘简历处理’‘简历存储’微服务,用Nginx分发请求。简历接收服务先检查Redis缓存(key为用户ID+时间戳,用SETNX加锁防重复),缓存命中则返回结果;否则推入Kafka。处理服务(多实例)消费消息,校验后写入数据库。数据库主写从读,用ShardingSphere-Proxy实现。Redis设置1小时过期时间,避免雪崩。消息队列配置10个消费者并行,流量大时自动扩容。熔断降级机制,当某服务压力过大时,降级返回默认提示,保证核心功能。这样能应对超100万请求,保持响应时间合理。”
SETNX命令加锁,避免并发查询数据库。SETNX加锁。