
1) 【一句话结论】:高并发广告投放系统需通过请求路由(负载均衡+去重)、缓存(加速+雪崩防护)、数据库(读写分离+分库分表)、容错(熔断降级+重试)等核心模块协同,实现低延迟、高可用,支撑海量广告请求的快速处理与稳定运行。
2) 【原理/概念讲解】:
3) 【对比与适用场景】:
负载均衡算法对比
| 算法 | 定义 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|---|
| 轮询 | 按顺序分发请求到节点 | 简单易实现 | 节点负载不均(如节点性能差异) | 节点数量少,负载均衡要求不高 |
| 加权轮询 | 根据节点性能/权重分发 | 考虑节点负载,性能高的节点处理更多请求 | 权重计算复杂 | 节点性能差异大,需按能力分配负载 |
| 一致性哈希 | 节点ID和请求ID哈希后取模 | 节点增减时数据迁移少(仅影响相邻节点),负载更均匀 | 需维护虚拟节点,实现复杂 | 节点动态扩容频繁,需低迁移成本 |
缓存淘汰策略对比
| 策略 | 定义 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|---|
| LRU(最近最少使用) | 移除最近最少访问的缓存项 | 自动淘汰不常用数据,保留热点数据 | 可能误淘汰高频数据(如热门广告位) | 广告位信息、用户画像(访问频率低,需淘汰旧数据) |
| TTL(生存时间) | 设置缓存项过期时间 | 定时自动删除,避免数据过时 | 需合理设置TTL(过短导致频繁更新,过长导致数据过时) | 广告素材、投放策略(数据变化慢,定期更新) |
4) 【示例】(广告请求处理流程伪代码):
用户广告请求 → 请求路由(Nginx)分发到后端服务
后端服务检查请求去重(Redis布隆过滤器):
若布隆过滤器判断已处理,直接返回失败(避免重复投放)
否则,生成唯一请求ID(如Snowflake),存入布隆过滤器(标记为已处理)
后端服务检查缓存(Redis):
key = "ad_position:#{ad_position_id}"
若存在,直接返回广告内容
否则,查询数据库(读库,读写分离):
SELECT * FROM ad_position WHERE id = ?
数据库返回广告位信息后,存入缓存(SET key value EX 3600,随机TTL)
返回广告内容给用户
(容错处理:若数据库查询超时,熔断直接返回失败;若缓存雪崩,通过令牌桶限流控制请求速率)
5) 【面试口播版答案】:
“面试官您好,设计高并发广告投放系统,核心是通过请求路由、缓存、数据库、容错等模块协同,实现低延迟和高可用。首先,请求路由用Nginx做负载均衡,结合一致性哈希算法,确保节点增减时数据迁移少,同时通过健康检查只分发到健康节点。然后,请求去重用Redis布隆过滤器,快速判断用户请求是否已处理,避免重复投放。缓存用Redis存储广告位信息,设置随机TTL防止雪崩,数据更新后异步刷新。数据库采用读写分离,读库分担读压力,按广告位ID哈希分库,按天分表优化查询。容错方面,熔断机制当后端服务超时率超过50%时直接返回失败,降级非核心功能,重试失败请求时用指数退避避免雪崩。各模块协同:用户请求先路由,再检查去重,缓存命中直接返回;未命中则读数据库,数据存入缓存后返回。这样能支撑高并发,保证响应速度和系统稳定性。”
6) 【追问清单】:
7) 【常见坑/雷区】: