
1) 【一句话结论】
采用微服务拆分业务,结合分布式缓存(Redis)、消息队列(Kafka)和数据库分库分表,通过负载均衡、读写分离等手段,实现高并发下的低延迟和高可用性,核心是解耦、分库分表、缓存穿透/雪崩处理。
2) 【原理/概念讲解】
老师口吻解释各组件作用:
3) 【对比与适用场景】
| 策略/组件 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 缓存穿透 | 请求不存在的数据,缓存未命中且数据库无结果 | 可能导致缓存和数据库压力激增 | 热门数据查询 | 需布隆过滤器或缓存空值 |
| 缓存雪崩 | 大量缓存同时过期,请求直接访问数据库 | 瞬间流量激增,数据库崩溃 | 缓存统一过期时间 | 设置随机过期时间或热点数据永不过期 |
| 消息队列(Kafka) | 分布式消息系统,高吞吐、持久化 | 实时性高,水平扩展 | 订单处理、日志收集 | 需考虑消息积压 |
| 消息队列(RabbitMQ) | 企业级消息中间件,支持多种消息模型 | 可靠性高,延迟低 | 事务消息、订单确认 | 需手动确认消息 |
4) 【示例】
请求流程(用户预订酒店):
hotel_info:hotel_id),存在则直接返回。伪代码(后端):
def book_hotel(hotel_id, room_count, date):
hotel = redis.get(f"hotel_info:{hotel_id}")
if hotel: return parse_hotel(hotel)
hotel = db.query("SELECT * FROM hotels WHERE id = ?", hotel_id)
if not hotel: return {"error": "酒店不存在"}
stock = stock_service.check_stock(hotel_id, room_count, date)
if stock < room_count: return {"error": "库存不足"}
stock_service.deduct_stock(hotel_id, room_count, date) # 异步扣减
order_id = db.insert("INSERT INTO orders (hotel_id, room_count, date, status) VALUES (?, ?, ?, ?)", hotel_id, room_count, date, "待支付")
kafka_producer.send("payment_notifications", {"order_id": order_id, "hotel_id": hotel_id})
return {"order_id": order_id, "message": "预订成功,请支付"}
5) 【面试口播版答案】
面试官您好,设计高并发酒店预订系统,核心是采用微服务拆分业务,结合分布式缓存、消息队列和数据库分库分表。具体来说,前端通过负载均衡分发请求,后端服务拆分为预订、库存、支付等微服务。缓存用Redis存储热门酒店信息,减少数据库压力;消息队列用Kafka解耦订单处理流程,比如下单后异步扣减库存、通知支付。数据库方面,订单表按酒店ID分库分表,读写分离,主库写,从库读。高可用方面,各组件部署多实例,通过健康检查实现自动切换,缓存设置随机过期时间避免雪崩,消息队列设置消费限流防止积压。这样能支持大促期间每秒数千笔订单,保证低延迟和高可用。
6) 【追问清单】
7) 【常见坑/雷区】