
1) 【一句话结论】
针对百万级用户、数百次/秒并发请求,充电预约系统需通过微服务拆分、分布式缓存(布隆过滤器防穿透+缓存+数据库)、异步消息队列+限流、数据库分库分表实现水平扩展,核心是“分而治之”,用缓存、异步、限流缓解实时压力,用分库分表支撑数据量。
2) 【原理/概念讲解】
老师口吻:高并发下的系统扩展核心是水平扩展(增加实例数量,像班级里多安排几个老师,每个老师负责一部分学生,总人数多了也不忙)。
3) 【对比与适用场景】
以**布隆过滤器 vs 普通缓存(Redis)**为例:
| 对比项 | 布隆过滤器 | 普通缓存(如Redis) |
|---|---|---|
| 定义 | 空间高效的哈希集合 | 内存缓存,存储键值对 |
| 特性 | 只能判断“可能存在”或“一定不存在” | 存储真实数据,可精确查询 |
| 使用场景 | 防缓存穿透(判断是否命中缓存) | 存储真实数据(如充电桩状态) |
| 注意点 | 可能存在误判(比如判断“存在”但实际不存在) | 需要设置过期时间,防雪崩 |
4) 【示例】
def create_order(user_id, charger_id):
order_id = generate_unique_id() # 生成唯一订单号
# 尝试获取分布式锁(如Redis锁)
with redis_lock(f"order:{order_id}"):
# 检查订单是否已存在(用订单号查询数据库)
if not db.exists(f"order:{order_id}"):
# 创建订单
db.set(f"order:{order_id}", {"user_id": user_id, "charger_id": charger_id})
return "订单创建成功"
else:
return "订单已存在,无需重复创建"
5) 【面试口播版答案】(约90秒)
“面试官您好,针对百万级用户、数百次/秒并发,我设计的扩展方案核心是‘分而治之’,通过微服务拆分、分布式缓存(布隆过滤器防穿透+缓存+数据库)、异步消息队列+限流、数据库分库分表实现水平扩展。首先,架构上拆分为用户、充电桩、订单等微服务,用Nginx负载均衡分发请求。缓存方面,先走布隆过滤器判断key是否存在(防穿透),若未命中再查Redis缓存,若Redis未命中才查数据库。限流用令牌桶,比如每秒1000个令牌,超过则返回429。订单创建时用唯一订单号或分布式锁保证幂等,避免重复下单。异步处理预约请求,放入Kafka,消费者慢慢处理,减少实时压力。数据库按区域分库分表,提升读写性能。这样系统就能支撑百万级并发了。”
6) 【追问清单】
7) 【常见坑/雷区】