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

佳都科技的智能轨道交通自动售检票(AFC)系统在高峰时段(如早高峰)面临秒杀场景,需要设计一个高并发、低延迟的订单处理系统,请描述系统架构设计,包括技术选型、核心模块设计、数据一致性处理等。

佳都科技工程交付工程师/计划管控专员/运维技术工程师难度:困难

答案

1) 【一句话结论】

采用微服务解耦业务,结合Redis缓存热点数据、分布式锁保障库存原子性、消息队列异步处理支付,通过数据库分库分表提升性能,并引入幂等性设计,实现秒杀场景下的高并发、低延迟订单处理。

2) 【原理/概念讲解】

针对高峰秒杀的高并发场景,系统设计需解决业务解耦、数据库压力、数据一致性等问题,核心技术如下:

  • 微服务架构:将订单、库存、支付拆分为独立服务,通过API网关统一入口,降低单个服务压力,提高扩展性(类比:大工厂拆成多个小车间,每个车间专注生产特定零件,避免单点过载)。
  • 消息队列(如Kafka):解耦订单创建与支付处理,避免直接调用导致阻塞(类比:快递中转站,订单创建是“寄件”,支付处理是“派件”,中转站让两者异步衔接,提升响应速度)。
  • Redis缓存:存储高频访问的热点数据(如秒杀商品库存、订单状态),减少数据库查询压力(类比:临时仓库,存放常用物品,避免每次都去大仓库取,降低数据库负载)。
  • 分布式锁(Redis SETNX):在库存扣减时使用,确保多线程/实例同时扣减库存时,仅一个成功,避免超卖(类比:抢票时,只有拿到锁的线程才能扣减库存,其他线程等待,保证原子性)。
  • 幂等性设计:订单表添加唯一索引(order_id, status)或Version字段,确保支付成功后更新状态时,重复请求不会重复处理(类比:身份证号唯一,避免重复办理业务)。
  • 数据库分库分表:将订单表按订单ID哈希分片(如order_id % 8),拆分到多个数据库/表,提高读写性能(类比:大仓库拆成多个小仓库,每个小仓库负责部分商品,取货更快,避免单表压力过大)。
  • Saga模式:订单创建→库存扣减→支付→通知,失败时补偿步骤,保证事务最终一致性(类比:餐厅点餐流程,先下单,再做菜,若做菜失败,需撤销订单,避免数据不一致)。

3) 【对比与适用场景】

缓存策略对比(缓存穿透/雪崩/击穿)

策略定义特性使用场景注意点
缓存穿透请求不存在的数据,查询数据库会导致数据库瞬间压力查询不存在的数据(如空字符串用户ID)需布隆过滤器或空值缓存(如Redis设置空值缓存SET key "" EX 60)
缓存雪崩大量缓存同时过期会导致数据库瞬间压力缓存大量数据,且过期时间集中设置随机过期时间(如EX 3600 + random(0, 3600)),避免集中过期
缓存击穿高频访问的缓存未初始化,所有请求都落库会导致数据库压力高频访问的缓存(如秒杀商品库存)热点数据预加载(如定时任务预热SET stock:{product_id} 1 EX 3600),或使用互斥锁(Redis SETNX)

分布式锁对比(Redis vs Zookeeper)

技术选型定义特性使用场景注意点
Redis SETNX原子性设置键,若不存在则设置速度快、简单库存扣减、秒杀抢购需设置过期时间(EX 10),避免死锁
Zookeeper集群协调服务,实现分布式锁可靠、支持复杂锁需要更复杂的锁逻辑配置复杂,适合高可用场景

4) 【示例】

订单处理流程伪代码(核心步骤):

  1. 用户下单请求(API网关限流):
    # 1. 限流(令牌桶,QPS=1000)
    if not rate_limit():
        return "流量过大,请稍后重试"
    
    # 2. 检查缓存库存(分布式锁保障原子性)
    stock_key = f"stock:{product_id}"
    # 尝试获取分布式锁,成功则扣减库存
    with redis_lock(stock_key, timeout=5):
        stock = redis.get(stock_key)
        if stock is None or int(stock) < 1:
            return "库存不足"
        redis.set(stock_key, int(stock) - 1, ex=3600)  # 更新缓存库存
    
    # 3. 生成订单ID,写入数据库(分库分表)
    order_id = generate_order_id()
    db.execute("INSERT INTO orders (order_id, product_id, user_id, amount) VALUES (?, ?, ?, ?)", 
               order_id, product_id, user_id, amount)
    
    # 4. 发送消息到支付队列(Kafka)
    kafka_producer.send("payment_queue", value=order_id)
    
    return "下单成功,支付中"
    
  2. 支付服务消费消息(幂等性处理):
    # 1. 消费Kafka消息
    order_id = kafka_consumer.receive()
    
    # 2. 检查订单状态(幂等性,避免重复支付)
    order = db.query("SELECT status FROM orders WHERE order_id = ? AND status IN ('pending', 'paid')", order_id)
    if not order or order.status == 'paid':
        return "订单已支付,无需处理"
    
    # 3. 调用支付网关
    payment_result = call_payment_gateway(order)
    
    # 4. 更新订单状态(事务)
    if payment_result == "success":
        db.execute("UPDATE orders SET status = 'paid' WHERE order_id = ?", order_id)
        send_notification(order)  # 发送支付成功通知
    else:
        db.execute("UPDATE orders SET status = 'failed' WHERE order_id = ?", order_id)
    

5) 【面试口播版答案】

(约90秒)
“针对高峰秒杀的高并发场景,系统设计采用微服务架构,将订单、库存、支付拆分为独立服务。通过Redis缓存热点数据(如秒杀商品库存),减少数据库压力;引入Kafka消息队列解耦订单创建与支付处理,避免阻塞。数据库通过分库分表(按订单ID哈希)提高读写性能,并使用Saga模式保证数据一致性。同时,API网关配置限流和熔断,应对突发流量。核心流程是用户下单→缓存校验库存(分布式锁保障原子性)→数据库持久化订单→消息队列触发支付→支付服务异步处理(幂等性检查),最终实现低延迟和高并发。”

6) 【追问清单】

  1. 问:如何解决缓存与数据库数据一致性问题?
    • 回答要点:对热点数据(如秒杀商品库存)预加载到Redis(定时任务或用户访问前预热),或支付成功后异步更新缓存(避免实时更新导致阻塞)。
  2. 问:如果消息队列积压,如何处理?
    • 回答要点:增加消费者实例(动态扩容),或调整生产者速率(令牌桶限流),或设置消息重试机制(失败后重试3次,避免丢失消息)。
  3. 问:数据库分库分表后,如何保证事务一致性?
    • 回答要点:采用Saga模式(补偿事务),避免分布式事务的复杂性,通过顺序执行业务步骤,失败时补偿步骤回滚,适合秒杀场景的强一致性需求。
  4. 问:缓存击穿如何处理?
    • 回答要点:对热点数据设置互斥锁(如Redis的SETNX命令),确保只有一个线程初始化缓存,其他线程等待,避免所有请求都落库导致数据库压力。
  5. 问:分布式锁的过期时间如何设置?
    • 回答要点:设置合理过期时间(如10秒),避免死锁,若业务耗时较长,可延长锁过期时间或使用红锁(多个Redis实例)。

7) 【常见坑/雷区】

  1. 缓存穿透:未命中时直接查询数据库,导致大量无效请求,需布隆过滤器或空值缓存(如Redis设置空值缓存SET key "" EX 60)。
  2. 消息队列积压:生产者速率超过消费者,导致系统阻塞,需监控队列积压长度,动态调整消费者数量或生产者限流。
  3. 数据库分库分表事务复杂:秒杀场景用Saga模式,避免分布式事务的复杂性(如两阶段提交),通过补偿步骤保证最终一致性。
  4. 缓存雪崩:大量缓存过期,导致数据库压力,需设置随机过期时间(如EX 3600 + random(0, 3600)),避免集中过期。
  5. 限流策略不当:限流阈值设置过低导致用户请求被拦截,需根据系统容量(如数据库QPS、缓存读写能力)动态调整,避免误伤正常用户。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1