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

设计一个支持百万级用户同时在线的在线教育直播课系统,作为iOS客户端开发,请描述从客户端到服务端的架构设计,重点考虑高并发下的实时性、数据一致性以及容错能力。

好未来IOS难度:困难

答案

1) 【一句话结论】
采用客户端-服务端分离的微服务架构,结合WebRTC音视频传输、Kafka顺序消息队列、Redis分布式缓存,通过数据库分库分表与分布式事务保障数据一致性,并引入断线重连、消息队列缓冲等容错机制,支撑百万级用户高并发下的实时交互与稳定性。

2) 【原理/概念讲解】
老师:咱们先拆解核心组件,从客户端到服务端,每个环节都针对高并发、实时性设计。

  • 客户端(iOS端):
    通过WebSocket与信令服务器建立长连接,用于数据同步(如用户状态、消息);同时配合WebRTC实现音视频流传输。比如,用户登录后,客户端先通过WebSocket获取WebRTC的SDP(Session Description Protocol)交换信息,快速建立音视频连接。
  • 服务端:
    采用微服务架构,拆分为信令服务(处理WebRTC信令)、直播服务(管理音视频流,如推流/拉流)、消息服务(处理互动消息,如举手、答题,通过Kafka顺序消费保证消息顺序)、用户服务(用户状态管理,结合Redis缓存)。消息队列(如Kafka)用于解耦消息分发,缓存(Redis)用于缓存用户状态、直播数据,减少数据库压力。
  • 数据一致性:
    数据库分库分表(如MySQL分库,或使用分布式数据库如TiDB),结合强一致场景(如用户状态变更,通过分布式事务或乐观锁保证,比如用户举手操作,先更新状态,再通过消息队列通知,服务端处理时检查事务一致性)和最终一致场景(如聊天消息,通过Kafka顺序消费+补偿机制,确保消息不丢失且顺序正确)。
  • 容错能力:
    客户端连接失败时采用延迟重连(避免频繁重连冲击服务器);服务端消息队列失败时重试+缓冲(Kafka缓冲未消费消息,确保消息不丢失);缓存失效时回源数据库(Redis设置过期时间,避免缓存雪崩);熔断机制防止服务雪崩(如API网关设置熔断阈值,服务间调用失败时熔断,避免级联故障)。

3) 【对比与适用场景】
以WebRTC与WebSocket为例(音视频传输与数据同步的对比):

特性WebRTCWebSocket
功能音视频流P2P传输数据同步(文本、信令)
原理P2P直接通信,减少服务器中转长连接,服务器中转
延迟低(P2P)较高(服务器中转)
适用场景课堂音视频直播(师生/同学互动)用户状态同步、聊天消息
注意点需信令服务器,网络限制(防火墙)长连接维护成本,消息顺序依赖服务器

4) 【示例】

  • Kafka分区保证顺序示例(服务端发送互动消息):
    // 消息服务发送用户举手消息
    Producer<String, String> producer = new KafkaProducer<>(props);
    // 分区键为用户ID,确保同一用户消息在同一分区
    producer.send(new ProducerRecord<>("live-interaction", "user123", "用户A举手了"), 
                  new Callback() {
                      @Override
                      public void onCompletion(RecordMetadata metadata, Exception exception) {
                          if (exception != null) {
                              // 重试或记录日志
                          }
                      }
                  });
    
  • Redis布隆过滤器过滤无效请求示例(用户登录):
    // 用户登录前检查布隆过滤器
    Jedis jedis = new Jedis("localhost");
    String bloomKey = "login_bloom";
    // 假设用户ID为123,布隆过滤器判断是否已登录
    if (jedis.sismember(bloomKey, "user123")) {
        // 已登录,拒绝请求
        return "用户已登录";
    }
    // 否则允许登录,并添加到布隆过滤器
    jedis.sadd(bloomKey, "user123");
    jedis.expire(bloomKey, 3600); // 过期时间1小时
    

5) 【面试口播版答案】
“面试官您好,设计百万级用户在线教育直播课系统,核心是构建客户端-服务端分离的实时架构。客户端通过WebSocket与信令服务器建立连接,配合WebRTC实现音视频传输,服务端拆分为信令、直播、消息等微服务,用Kafka顺序分发互动消息,Redis缓存用户状态。数据库分库分表保证数据一致性,同时引入断线重连、消息队列缓冲等容错机制。具体来说,用户登录后,客户端先通过WebSocket获取WebRTC信令,建立音视频连接;服务端通过Kafka将互动消息(如举手、答题)推送给所有用户,Redis缓存用户状态减少数据库压力。客户端支持延迟重连,服务端消息队列缓冲未消费消息,确保高并发下的实时性和稳定性。”

6) 【追问清单】

  • 问:如何保证互动消息(如举手、答题)的顺序?
    答:通过Kafka按用户ID分区,确保同一用户的消息在同一个分区,顺序消费保证消息顺序。
  • 问:如何处理缓存与数据库不一致?
    答:Redis设置过期时间(如5分钟),布隆过滤器过滤无效请求,避免缓存雪崩;同时通过消息队列异步更新数据库,确保最终一致性。
  • 问:客户端断线重连时,如何避免频繁重连冲击服务器?
    答:采用延迟重连策略,比如第一次断线后等待3秒重连,第二次等待5秒,逐步增加延迟,降低服务器压力。
  • 问:数据库分库分表后,如何保证用户状态变更的强一致性?
    答:通过分布式事务(如两阶段提交)或乐观锁(如版本号),确保用户状态变更后,服务端处理时检查事务一致性。
  • 问:微服务间调用延迟如何控制?
    答:通过API网关设置熔断阈值,服务间用消息队列解耦,避免直接调用,提升系统弹性。

7) 【常见坑/雷区】

  • 忽略Kafka顺序保证机制,导致消息乱序(如举手和答题顺序颠倒);
  • 缓存未设置过期策略,导致数据不一致(如用户状态未更新);
  • 断线重连策略不合理,频繁重连冲击服务器;
  • 数据库分库分表未考虑读写分离,导致高并发下查询慢;
  • 微服务拆分边界不清晰,导致调用复杂,影响系统性能。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1