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

好未来有数百万学生和数万课程,需要设计一个支持高并发、低延迟的课程表管理服务,请描述其核心架构设计,包括如何处理并发请求、数据一致性保障、以及如何应对开学季等峰值流量?

好未来基础平台难度:困难

答案

1) 【一句话结论】:针对好未来数百万学生、数万课程的高并发课程表管理服务,核心采用微服务拆分(选课、排课、查询、通知等)、分布式缓存(Redis)、消息队列(Kafka)、数据库分库分表(用户分库、课程分表),通过读写分离、异步处理、缓存预热等策略,支撑高并发低延迟,并有效应对开学季流量峰值。

2) 【原理/概念讲解】:老师口吻,解释关键设计逻辑:

  • 微服务拆分:按业务职责拆分为选课服务(处理用户选课、退课,核心业务逻辑)、排课服务(课程时间冲突检查,如用户选课前调用排课服务验证时间是否冲突)、查询服务(课程表查询、历史记录查询,提供用户端展示)。各服务独立部署,通过负载均衡(如Nginx)分发请求,降低单点压力。类比“企业按部门分工,选课部负责用户选课,排课部检查时间冲突,查询部提供课程表展示,避免业务集中导致瓶颈”。
  • 分布式缓存(Redis):缓存热点课程表数据(如用户常用课程表、热门课程信息),查询服务先从缓存获取,若缓存未命中,查询数据库并回写缓存(缓存预热)。提升查询速度,减少数据库压力。类比“超市货架,常用商品放在货架,快速取用,减少去仓库的次数”。
  • 消息队列(Kafka):异步处理非实时性请求(如课程调整通知、用户消息推送),课程调整服务将调整事件发布到Kafka,订阅服务消费后处理(如发送通知)。避免阻塞主流程,提高系统吞吐量。类比“快递分拣中心,非紧急包裹延迟处理,不影响主流程”。
  • 数据库分库分表:用户表按用户ID哈希分库(每个库存储部分用户数据,如用户ID mod 8,分8个库),课程表按课程ID哈希分表(每个表存储部分课程数据,如课程ID mod 16,分16个表),水平扩展数据库容量。读写分离:主库负责写(如用户选课),从库负责读(如查询课程表),降低主库压力。类比“仓库分区,每个分区存储部分商品,总容量扩大,取货更快”。
  • 数据一致性:强一致性场景(如用户选课后立即同步所有服务数据)采用SAGA模式(补偿事务,确保每个步骤成功才提交);最终一致性场景(如课程调整通知)采用事件驱动+补偿机制,通过消息队列确保最终数据一致,失败时触发补偿逻辑。

3) 【对比与适用场景】:

  • 缓存问题解决方案:
    策略定义特性使用场景注意点
    缓存雪崩大量缓存失效(如Redis宕机或集中过期),导致所有请求都去数据库,引发瞬时高并发瞬时流量激增,数据库压力爆炸高并发场景,缓存集中失效设置短时间过期(如5分钟),或使用分布式锁控制并发写入,或限流(熔断器)
    缓存击穿单个热点数据失效(如热门课程表),所有请求都去数据库,导致单点压力单点高并发,数据库单点压力热点数据查询(如热门课程)设置默认值(如“课程未找到”),或提前预热(将热点数据加载到缓存,设置较长时间过期)
    缓存穿透查询不存在的数据(如非法课程ID),缓存和数据库都无结果,导致流量穿透恒定无效流量,消耗资源非法查询或恶意攻击存空值(如“null”),或使用布隆过滤器过滤无效请求,避免查询数据库
  • 一致性方案:
    方案适用场景实现方式优点缺点
    强一致性(SAGA模式)需要立即同步所有服务数据(如用户选课后,查询服务立即返回最新数据)选课服务→更新课程容量→发布事件→查询服务消费数据实时一致,用户体验好性能低,复杂度高,故障时可能阻塞
    最终一致性(事件驱动+补偿)非实时性数据(如课程调整通知),允许短暂不一致发布-订阅(Kafka),补偿机制(Saga)性能高,系统解耦数据可能短暂不一致,需补偿

4) 【示例】:

  • 用户选课流程(伪代码,含幂等性):
    def user_select_course(user_id, course_id):
        key = f"user_course:{user_id}:{course_id}"
        if redis.setnx(key, "pending", ex=10):  # 10秒锁
            course = db.query("SELECT capacity FROM course WHERE id = ?", course_id)
            if course.capacity <= 0:
                redis.delete(key)  # 容量不足,取消锁
                return "课程已满"
            db.update("UPDATE course SET capacity = capacity - 1 WHERE id = ?", course_id)
            db.insert("INSERT INTO user_course (user_id, course_id) VALUES (?, ?)", user_id, course_id)
            redis.set(key, "true", ex=3600)  # 设置有效时间
            return "选课成功"
        else:
            return "已处理该请求,请稍后重试"
    
  • 课程调整异步处理(Kafka示例):
    • 课程调整服务:
      def adjust_course_schedule(course_id, new_schedule):
          db.update("UPDATE course_schedule SET schedule = ? WHERE id = ?", new_schedule, course_id)
          kafka_producer.send("course_adjust_topic", value=json.dumps({"course_id": course_id, "new_schedule": new_schedule}))
      
    • 订阅服务(通知服务):
      def process_course_adjust(message):
          data = json.loads(message.value)
          course_id = data["course_id"]
          new_schedule = data["new_schedule"]
          user_ids = db.query("SELECT user_id FROM user_course WHERE course_id = ?", course_id)
          notification_service.send(user_ids, f"课程{course_id}调整,新安排:{new_schedule}")
      

5) 【面试口播版答案】:面试官您好,针对好未来数百万学生、数万课程的高并发课程表管理服务,我的核心设计思路是采用微服务拆分(选课、排课、查询、通知等)、分布式缓存(Redis)、消息队列(Kafka)、数据库分库分表(用户分库、课程分表),通过读写分离、异步处理、缓存预热等策略,支撑高并发低延迟,并有效应对开学季流量峰值。具体来说,选课服务处理用户选课,排课服务检查时间冲突,查询服务提供课程表展示;查询服务先从Redis缓存获取数据,缓存未命中则查询数据库并回写;课程调整等非实时请求通过Kafka异步处理,避免阻塞主流程;数据库按用户ID分库、课程ID分表,结合读写分离降低压力。这样既能保证低延迟,又能应对开学季的流量冲击。

6) 【追问清单】:

  1. 如何保证课程表数据的一致性?
    回答要点:强一致性用SAGA模式(补偿事务,确保每个步骤成功才提交),最终一致性用事件驱动+补偿机制(Kafka发布课程调整事件,订阅服务处理通知,失败时触发补偿)。
  2. 开学季如何预测流量并提前扩容?
    回答要点:通过监控QPS、错误率、缓存命中率等指标,结合历史数据预测峰值,配置K8s自动扩容策略(如根据负载动态调整实例数量)。
  3. 分布式缓存如何解决缓存雪崩问题?
    回答要点:设置缓存短时间过期(如5分钟),或使用分布式锁控制并发写入,或限流(熔断器限制请求频率)。
  4. 微服务间如何通信?
    回答要点:采用RESTful API或gRPC,结合服务发现(如Nacos),通过API网关统一入口,处理认证、限流等。
  5. 如何处理跨服务事务?
    回答要点:强一致性用SAGA模式(补偿事务),最终一致性用消息队列协调各服务状态。

7) 【常见坑/雷区】:

  1. 微服务拆分边界不明确,导致服务耦合度高,扩展性差(如选课服务直接调用查询服务,违反职责)。
  2. 数据库分库分表策略错误(如按课程ID分库导致用户选课时跨库查询,增加复杂度)。
  3. 消息队列选型不当(如用RabbitMQ处理高吞吐量请求,导致延迟或消息丢失)。
  4. 缓存问题未考虑雪崩、击穿、穿透(如未设置默认值或预热,导致数据库压力激增)。
  5. 一致性方案选择不当(如强一致性导致性能下降,最终一致性未保证业务正确性,如课程容量未更新导致选课失败)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1