1) 【一句话结论】
针对高并发用户请求(如登录、匹配),采用分层分布式架构,通过负载均衡、缓存(含击穿/雪崩应对)、消息队列协同,结合多活容灾与数据最终一致性策略,实现系统弹性与低延迟。
2) 【原理/概念讲解】
老师口吻:分布式架构核心是解耦与扩展,通过拆分服务、引入中间件提升系统弹性。
- 服务发现:用于动态管理服务实例,如Consul或Etcd。节点启动时注册自身信息(IP、端口、健康状态),负载均衡器通过服务发现实时获取可用服务实例,确保请求分发到健康节点。
- 负载均衡:Nginx或LVS分发请求,常见算法有轮询(简单公平)、加权轮询(资源不均)、随机(请求无规律)、一致性哈希(节点增删影响小)。
- 缓存:Redis存储热点数据(用户信息、配置),减少数据库压力,类比“快速访问的临时存储”。
- 缓存击穿:热点key高并发请求时,用互斥锁(Redis
SETNX)防并发写入,只有成功才查数据库,避免雪崩。
- 缓存雪崩:随机过期时间或限流,避免大量key同时过期导致数据库压力。
- 消息队列:如Kafka,用于异步处理(如用户登录后更新状态),避免阻塞主流程,类比“异步任务调度中心”。
- 数据库复制:MySQL主从复制,主库写、从库读,保证数据最终一致,游戏场景允许延迟(如1-2秒内同步),避免强一致性带来的性能损失。
- 多活容灾:部署多活节点(如北京、上海),通过心跳检测健康状态,故障时自动切换,数据同步通过主从复制。
3) 【对比与适用场景】
负载均衡算法对比表
| 算法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|
| 轮询 | 按顺序分发请求 | 简单公平 | 新系统、请求均匀 | 可能导致后部署服务负载低 |
| 加权轮询 | 根据服务器性能加权 | 适应资源差异 | 资源不均的服务器 | 需准确评估权重 |
| 随机 | 随机选择 | 请求无规律 | 请求随机 | 可能导致部分服务器过载 |
| 一致性哈希 | 基于哈希环 | 节点增删影响小 | 分布式存储 | 需维护哈希环 |
缓存击穿/雪崩应对策略对比
| 问题 | 应对策略 | 实现方式 | 适用场景 |
|---|
| 缓存击穿 | 互斥锁防并发 | Redis SETNX(key: lock:uid, expire: 10s) | 热点key高并发 |
| 缓存雪崩 | 随机过期/限流 | 随机TTL(60-120s)或限流器(令牌桶) | 大量key同时过期 |
4) 【示例】
用户登录流程(伪代码):
- 用户请求到Nginx负载均衡器,轮询分发到登录服务集群(北京节点)。
- 登录服务检查Redis缓存(key:
user:uid:info),若存在,直接返回用户信息。
- 缓存未命中,执行Redis
SETNX(key: lock:uid, value: 1, expire: 10s),成功则查MySQL数据库:
- 查数据库获取用户信息(如uid=1001,用户名“玩家A”)。
- 存入Redis(key:
user:uid:info, value: 数据, TTL: 60s)。
- 返回登录成功。
- 登录成功后,Kafka发送消息(topic:
user_status, message: {"uid": 1001, "status": "online"})。
- 匹配服务消费Kafka消息,更新用户在线状态(从数据库或缓存同步)。
容灾示例:北京节点心跳超时(10秒无响应),Nginx切换到上海节点,数据同步通过MySQL主从复制,故障切换后验证用户数据一致性(如查询用户在线状态是否正确)。
5) 【面试口播版答案】
(约90秒)
“面试官您好,针对高并发用户请求(如登录、匹配),我设计的分布式架构核心是分层解耦,通过负载均衡、缓存(含击穿/雪崩应对)、消息队列协同,同时考虑多活容灾与数据最终一致性。具体来说,比如用户登录时,先查Redis缓存,缓存没命中用互斥锁防并发写入(避免雪崩),再查数据库,结果存缓存后返回。登录成功后,通过Kafka异步更新用户状态,匹配服务消费后处理。容灾方面,部署多活节点(北京、上海),用心跳检测故障,自动切换。数据一致性通过MySQL主从复制,缓存同步用消息队列,确保最终一致,游戏场景允许延迟(1-2秒内同步),避免强一致性带来的性能损失。这样既能应对高并发,又能保证系统弹性与数据一致性。”
6) 【追问清单】
- 问:缓存击穿和雪崩具体怎么处理?比如代码或逻辑?
回答要点:缓存击穿用Redis SETNX加锁,只有成功才查数据库;缓存雪崩用随机过期时间或限流器,避免大量请求同时过期。
- 问:为什么游戏场景选择最终一致性而非强一致性?比如用户登录后状态同步?
回答要点:游戏场景允许状态同步有延迟(如1-2秒),强一致性会牺牲性能,最终一致性通过消息队列异步同步,降低系统复杂度。
- 问:容灾方案中,故障切换的具体流程和验证方式?
回答要点:故障节点心跳超时,负载均衡器切换到备用节点,数据同步通过主从复制,切换后验证用户数据(如查询用户在线状态是否一致)。
- 问:负载均衡器选哪种算法?为什么?
回答要点:根据场景选,比如新系统用轮询简单公平,资源不均用加权轮询,请求随机用随机,分布式存储用一致性哈希。
- 问:微服务拆分的原则是什么?比如登录和匹配服务拆分?
回答要点:按业务功能拆分,独立部署,便于扩展,比如登录服务负责用户认证,匹配服务负责匹配逻辑,解耦后各自独立升级。
7) 【常见坑/雷区】
- 雷区1:未提及服务发现,导致负载均衡器无法实时获取可用服务实例,影响请求分发。
- 雷区2:缓存击穿应对中锁的释放逻辑未说明(如未设置TTL),可能引发死锁。
- 雷区3:消息队列未考虑消费者确认机制(如ACK),可能导致数据丢失。
- 雷区4:数据一致性未明确延迟时间范围(如未说明1-2秒内),缺乏边界条件说明。
- 雷区5:对“低延迟”表述过于绝对,未考虑实际网络因素(如延迟受网络抖动影响)。