51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

请设计一个旅游酒店预订系统的核心模块(订单处理与库存同步),需考虑高并发场景(如大促期间同时处理数千笔订单)、数据一致性(订单创建与库存扣减的强一致性要求),并说明技术选型(如分布式事务、最终一致性方案)和关键优化点(如缓存、消息队列)。

南光(集团)有限公司旅游酒店类难度:困难

答案

1) 【一句话结论】

为解决高并发下的订单与库存强一致性,采用Saga模式(分布式事务)+消息队列异步解耦方案,通过缓存预热、幂等性设计确保数据一致性,既保证业务强一致性(通过补偿机制维持),又优化高并发性能。

2) 【原理/概念讲解】

旅游酒店预订系统的核心是订单创建与库存扣减的强一致性,需平衡高并发性能与数据一致性。订单处理流程:用户下单→订单创建(写入订单表,状态“待支付”)→库存扣减(检查库存,扣减后更新库存表,或通过消息队列异步扣减)→支付成功后更新订单状态。

分布式事务分类:

  • 两阶段提交(2PC):领导者协调所有参与者,先预提交再提交,强一致性但高并发下阻塞严重,易导致系统崩溃。
  • Saga模式:分阶段执行,每个阶段独立提交,失败后通过补偿服务回滚,低阻塞且适合业务复杂场景(订单、库存、支付多阶段)。

缓存(如Redis)用于预热热点库存,减少数据库压力;消息队列(如RabbitMQ/Kafka)解耦订单与库存系统,提高吞吐量。

类比:库存扣减像“银行转账”(需原子性),Saga模式像“多步骤业务”,每步提交,失败后回滚(补偿),确保最终一致。

3) 【对比与适用场景】

方案类型定义特性使用场景注意点
两阶段提交(2PC)领导者协调所有参与者,先预提交再提交强一致性,但高并发下阻塞严重,系统易崩溃需强一致性(如金融核心交易)领导者故障导致全系统阻塞
Saga模式分阶段执行,每个阶段独立提交,失败后通过补偿服务回滚最终一致性,低阻塞,适合业务复杂场景(订单、库存、支付多阶段)旅游预订(订单、库存、支付多阶段)补偿逻辑复杂,需幂等
最终一致性(消息队列+补偿)订单创建后,发送消息到库存系统,库存系统异步处理高吞吐,低延迟,允许短暂不一致大促期间高并发,允许短暂不一致需幂等处理,补偿延迟

4) 【示例】

订单创建流程(伪代码):

def create_order(user_id, hotel_id, room_type, quantity):
    # 1. 创建订单(写入订单表,状态=待支付)
    order_id = order_service.create(user_id, hotel_id, room_type, quantity, status='待支付')
    # 2. 检查库存(缓存优先)
    stock = cache.get(f'hotel_{hotel_id}_{room_type}')
    if stock < quantity:
        return {'code': -1, 'msg': '库存不足'}
    # 3. 扣减库存(异步消息)
    send_message('stock_decrease', {
        'order_id': order_id,
        'hotel_id': hotel_id,
        'room_type': room_type,
        'quantity': quantity
    })
    return {'code': 0, 'msg': '下单成功,库存已锁定'}

库存系统处理消息(伪代码):

@message_consumer('stock_decrease')
def handle_stock_decrease(message):
    order_id = message['order_id']
    hotel_id = message['hotel_id']
    room_type = message['room_type']
    quantity = message['quantity']
    # 1. 检查订单状态(是否已支付)
    order = order_service.get(order_id)
    if order.status != '待支付':
        # 补偿:回滚库存(如果已扣减)
        rollback_stock(hotel_id, room_type, quantity)
        return
    # 2. 扣减库存(数据库更新)
    stock = stock_service.get(hotel_id, room_type)
    if stock >= quantity:
        stock_service.update(hotel_id, room_type, stock - quantity)
        cache.set(f'hotel_{hotel_id}_{room_type}', stock - quantity)
        # 更新订单状态为已锁定
        order_service.update(order_id, status='已锁定')
    else:
        # 补偿:回滚库存(如果库存不足)
        rollback_stock(hotel_id, room_type, quantity)
        # 订单状态置为失败
        order_service.update(order_id, status='失败')

5) 【面试口播版答案】

面试官您好,针对旅游酒店预订系统的高并发订单处理与库存同步问题,我设计的核心方案是采用Saga模式(分布式事务)结合消息队列异步解耦,同时通过缓存预热和幂等性设计优化性能。具体来说,用户下单时,订单创建与库存扣减分阶段执行:订单先写入数据库并标记为待支付,然后通过消息队列异步通知库存系统扣减;库存系统处理消息时,先检查订单状态,再扣减库存,若失败则通过补偿机制回滚。这样既保证了强一致性(通过Saga的补偿),又解决了高并发下的阻塞问题。技术选型上,订单和库存系统通过RabbitMQ/ Kafka消息队列解耦,缓存使用Redis预热热点库存,消息处理采用幂等性确保重复消费不重复扣减。关键优化点包括:缓存双写(数据库更新后同步缓存)、消息延迟重试(处理超时消息)、库存预分配(大促前预热缓存)等,确保大促期间能处理数千笔订单。

6) 【追问清单】

  • 问题1:分布式事务具体如何实现?比如Saga的补偿逻辑如何设计?
    回答要点:Saga分阶段执行,每个阶段提交后,失败时通过补偿服务回滚,补偿逻辑需幂等,避免重复回滚。
  • 问题2:缓存雪崩或热点数据如何处理?
    回答要点:缓存预热(大促前加载热点库存到缓存)、设置合理的TTL、使用分布式锁或限流保护数据库。
  • 问题3:消息队列的延迟消息或死信队列如何处理?
    回答要点:对于超时未处理的库存扣减消息,放入延迟队列,设定超时时间后重试,死信队列用于持久化失败消息,便于排查。
  • 问题4:如果订单创建和库存扣减同时失败,如何保证数据一致性?
    回答要点:Saga模式中,订单创建失败则不发送库存消息,库存系统不处理;库存扣减失败则补偿回滚库存,订单状态置为失败,确保最终一致性。

7) 【常见坑/雷区】

  • 雷区1:直接采用两阶段提交解决强一致性,忽略高并发下的阻塞问题,导致大促时系统崩溃。
  • 雷区2:忽略消息队列的幂等性,导致重复消费库存扣减消息,造成库存超卖。
  • 雷区3:缓存与数据库双写未考虑延迟,导致数据不一致(如订单已创建但库存未扣减,用户下单后库存不足)。
  • 雷区4:补偿逻辑未幂等,导致重复回滚库存,造成库存异常。
  • 雷区5:未考虑消息队列的延迟消息处理,超时消息未重试,导致库存扣减失败后无法恢复。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1