面试场景演练 面试情景题及答案大全
淘宝搜:【红包到手667】领超级红包,京东搜:【红包到手667】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】
文章目录
- 一、淘宝双11秒杀系统
- 二、抖音直播弹幕系统
- 三、微信红包系统
- 四、支付宝支付系统
- 案例共性总结
高并发架构的实际案例往往来自互联网大厂的核心业务场景(如电商秒杀、社交直播、支付系统等),这些案例中沉淀的技术方案具有很强的参考价值。以下是几个典型案例及核心架构设计思路:
一、淘宝双11秒杀系统
场景特点:瞬间流量峰值(如某商品1秒内涌入100万请求)、库存有限(需严格防超卖)、用户体验要求高(低延迟)。
核心架构方案:
- 流量分层拦截
- 前端层:按钮置灰(未到时间不可点击)、验证码/滑块验证(过滤80%无效请求)、预加载静态资源到CDN(减少服务器压力)。
- 接入层:Nginx集群限流(单IP每秒最多2次请求)、网关(如Spring Cloud Gateway)按用户等级/历史行为动态调整限流阈值(优先保障活跃用户)。
- 库存预热与原子扣减
- 活动前1小时,将商品库存(如10万件)批量加载到Redis集群(),避免秒杀开始时大量请求穿透到数据库。
- 秒杀逻辑:用Redis的原子操作扣减库存(),返回值≥0则视为“抢单成功”,直接返回结果;失败则立即返回“已抢完”。
- 异步化与削峰
- 抢单成功后,不直接操作数据库,而是将订单信息(用户ID、商品ID)发送到Kafka消息队列( Topic: ),后台消费者集群异步写入订单库(分库分表存储,按用户ID哈希分片)。
- 消息队列做缓冲,即使瞬间100万请求,也能按消费者处理能力平滑消化(避免数据库被打垮)。
- 高可用保障
- Redis集群:主从+哨兵架构(3主3从),单主故障后10秒内自动切换,避免缓存单点失效。
- 降级策略:若Redis集群故障,立即切换到“静态页面+排队提示”,避免请求直达数据库。
二、抖音直播弹幕系统
场景特点:单直播间每秒数万条弹幕(如明星直播时,弹幕量达5万条/秒)、实时性要求高(延迟<1秒)、读多写少(用户主要看弹幕,而非发弹幕)。
核心架构方案:
- 读写分离与分片
- 写入层:弹幕发送请求经负载均衡(如LVS)分发到写入服务集群,每条弹幕生成唯一ID(雪花算法),异步写入Kafka( Topic按直播间ID分片,如1000个分区,避免单分区压力)。
- 读取层:弹幕查询服务从Kafka消费数据,按直播间ID缓存到本地内存(如Caffeine缓存,保留最近1000条)和Redis集群(按直播间ID哈希分片,存储历史弹幕)。
- 多级缓存与预热
- 本地缓存:每个弹幕查询服务实例缓存当前热门直播间的弹幕(如前100名直播间),减少分布式缓存访问。
- Redis集群:采用读写分离(主库写、从库读),从库数量按读量动态扩容(如1主5从支撑高读并发)。
- 流量控制与降级
- 针对非热门直播间(在线人数<1000),弹幕更新频率降低(如500ms批量推送一次),节省资源。
- 极端流量时(如某直播间瞬间涌入100万用户),自动降级为“只显示关注用户的弹幕”,减少数据量。
三、微信红包系统
场景特点:春节期间峰值达10亿次/天,单群红包拆开瞬间有上百次抢红包请求,需保证“先到先得”且金额随机分配。
核心架构方案:
- 红包预生成与缓存
- 发红包时,后端服务预先生成所有子红包金额(如100元拆分为10个红包,金额随机分配),存储到Redis(Hash结构:),同时记录红包总金额、剩余数量。
- 红包ID与群ID绑定,发红包成功后,仅向群内用户推送“有红包”通知,避免全网用户抢一个群的红包。
- 抢红包原子操作
- 用户抢红包时,Redis执行Lua脚本(保证原子性):
- 检查红包是否已抢完(是否为0)。
- 未抢完则随机弹出一个子红包(),记录抢到的用户ID和金额。
- 整个过程在Redis中完成(耗时<1ms),避免数据库交互,支撑高并发。
- 异步记账与一致性保障
- 抢红包成功后,异步发送消息到Kafka,由记账服务消费并写入数据库(分库分表存储,按红包ID分片)。
- 定时任务(每10分钟)对比Redis已抢记录和数据库记录,修复不一致(如Redis显示已抢但数据库未记账)。
四、支付宝支付系统
场景特点:日均交易数亿笔,单笔支付需经过风控、账户校验、余额扣减等多环节,要求零数据不一致(钱不能多扣/少扣)。
核心架构方案:
- 服务拆分与异步化
- 将支付流程拆分为独立服务:风控服务(判断是否为风险交易)、账户服务(校验余额)、扣减服务(扣钱)、通知服务(推送支付结果)。
- 非核心流程异步化:支付成功后,短信通知、积分更新等通过消息队列异步处理,主流程只保证“扣钱”成功。
- 分布式事务与最终一致性
- 采用TCC模式(Try-Confirm-Cancel)处理跨服务事务:
- Try阶段:冻结用户余额(如用户A余额100元,冻结50元)。
- Confirm阶段:确认扣减(解冻50元并扣减,余额变为50元)。
- Cancel阶段:若失败(如商户系统故障),解冻冻结金额(恢复100元)。
- 用Seata作为分布式事务中间件,协调各服务状态,保证最终一致性。
- 多级缓存与限流
- 账户余额缓存:用户余额实时同步到Redis(),查询时先查Redis,减少数据库访问。
- 限流策略:按用户等级设置支付频率(如普通用户每秒最多3笔,VIP用户每秒10笔),用Sentinel实现接口级限流。
案例共性总结
这些高并发架构案例虽场景不同,但核心思路高度一致:
- 流量拦截:从前端到接入层层层过滤无效请求,减少后端压力。
- 缓存优先:热点数据(库存、弹幕、余额)放缓存,避免数据库成为瓶颈。
- 异步削峰:用消息队列缓冲突发流量,将“瞬间高并发”转为“平滑处理”。
- 服务拆分:按业务边界拆分为微服务,各自独立扩容,避免单服务过载。
- 高可用设计:核心组件(缓存、数据库、消息队列)多副本部署,故障自动转移。
实际设计时,需结合业务特点(如实时性要求、数据一致性要求)选择合适方案,而非盲目堆砌技术。