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

设计一个支持千万级用户的短视频推荐页面的前端架构,请考虑页面加载速度、用户交互体验、数据一致性等方面。

快手前端开发工程师 📦 工程类难度:困难

答案

1) 【一句话结论】

针对千万级用户短视频推荐页面,采用分层前端架构(客户端+服务端+CDN),结合视频流式加载(HLS/DASH+CDN分片)、个性化分页(用户行为预测)、多级缓存(CDN强缓存+本地存储+Redis),并采用最终一致性(事件溯源+消息队列+冲突检测),确保首屏加载速度、交互流畅性及数据最终一致性。

2) 【原理/概念讲解】

老师口吻解释关键概念:

  • 分层架构:客户端负责交互逻辑(如滚动、点击),服务端处理业务逻辑(数据查询、模型计算),CDN分发静态资源(视频缩略图、样式文件),降低网络延迟。
  • 视频流式加载:采用HLS(HTTP Live Streaming)或DASH(Dynamic Adaptive Streaming over HTTP),将视频文件分片(如1秒/片),CDN缓存分片,用户播放时按需加载,避免一次性加载大文件导致卡顿。
  • 个性化分页:根据用户历史行为(如观看时长、点赞、收藏)预测兴趣,调整视频加载顺序(如热门视频优先加载,个性化推荐视频后加载),提升推荐体验。
  • 多级缓存:CDN设置强缓存(Cache-Control: max-age=3600),本地存储缓存视频元数据(列表、用户信息),服务端Redis缓存热点数据(如热门视频列表),减少数据库查询。
  • 最终一致性:用户操作(如点赞)通过事件溯源记录(用户ID、视频ID、时间戳),消息队列(如Kafka)异步处理,数据库更新时带版本号,冲突时按时间戳优先(较新记录覆盖旧记录)。
  • 懒加载触发条件:结合视口内元素、滚动速度(<10px/frame,避免快速滚动)、时间节流(300ms内无事件),触发时请求资源,动态调整阈值(移动端阈值降低,桌面端提高,根据设备性能)。

3) 【对比与适用场景】

方面视频流式加载(HLS/DASH)分页加载(传统)
定义视频分片,按需加载一次性加载固定数量数据
优势减少初始资源占用,播放流畅适合静态内容,初始加载快
劣势需CDN支持,复杂度高首屏后加载慢,用户体验差
适用场景千万级用户短视频播放(如抖音、快手)小型应用或静态列表

4) 【示例】

  • 视频流式加载请求:GET /api/videos/stream?videoId=123&format=m3u8(CDN返回HLS分片列表,客户端按需请求分片)。
  • 个性化分页请求:GET /api/videos?page=1&limit=20&userBehavior=watched:5,pinned:2(服务端根据用户行为预测加载顺序)。
  • 懒加载触发逻辑(伪代码):
    const lazyLoad = () => {
      const elements = document.querySelectorAll('.lazy-video');
      elements.forEach(el => {
        if (el.getBoundingClientRect().top < window.innerHeight && !el.dataset.loaded) {
          el.dataset.loaded = true;
          fetch(`/api/videos/load?videoId=${el.dataset.id}`)
            .then(res => res.json())
            .then(data => {
              // 渲染视频元素
            });
        }
      });
    };
    window.addEventListener('scroll', lazyLoad);
    
  • 缓存预热:启动时请求热门视频列表,设置强缓存(Cache-Control: max-age=3600),后续请求直接从缓存获取。
  • 事件溯源流程:
    用户点赞→客户端记录事件({userId: 1, videoId: 123, timestamp: 1678888888888})→发送至Kafka→服务端消费→更新推荐模型(计算用户兴趣向量)→更新数据库(UPDATE videos SET version = version + 1 WHERE id = 123,冲突时比较timestamp,更新较新的记录)。

5) 【面试口播版答案】

“面试官您好,针对千万级用户短视频推荐页面,我设计的架构核心是分层处理,结合视频流式加载(HLS协议+CDN分片)、个性化分页(用户行为预测)、多级缓存(CDN强缓存+本地存储+Redis),并采用最终一致性(事件溯源+消息队列+冲突检测),确保首屏加载速度、交互流畅性及数据最终一致性。具体来说,页面初始只加载第一页视频(约20条),采用懒加载技术,用户滚动时动态加载后续视频,减少初始资源占用。视频播放时,通过HLS协议将视频分片(1秒/片),CDN缓存分片,用户按需加载,避免卡顿。为了提升首屏速度,采用服务端渲染(SSR),服务器预生成包含视频列表的HTML,客户端无需等待JS渲染。数据一致性方面,由于用户行为高频,采用最终一致性,用户操作通过事件溯源记录,消息队列异步处理,确保数据最终同步。缓存策略上,CDN设置强缓存(如Cache-Control: max-age=3600),本地存储缓存视频元数据,服务端Redis缓存热点数据,减少数据库压力。交互体验上,视频点击后懒加载播放,避免页面卡顿。整体架构通过这些措施,平衡了加载速度、交互体验和数据一致性,适合千万级用户场景。”

6) 【追问清单】

  1. 问:视频流式加载中,HLS分片大小如何设定?CDN如何处理分片缓存?
    • 答:分片大小通常设为1-2秒(如1秒),CDN通过缓存控制头(Cache-Control: max-age=86400)缓存分片,用户播放时按需请求,减少服务器压力。
  2. 问:个性化分页中,用户行为预测模型如何训练?如何避免冷启动问题?
    • 答:使用协同过滤或深度学习模型(如矩阵分解),冷启动时结合用户画像(如新用户推荐热门视频),定期更新模型(如每日训练),确保推荐准确。
  3. 问:缓存预热的具体做法?如果用户刷新页面,如何确保获取最新数据?
    • 答:启动时请求热门视频列表,设置强缓存(Cache-Control: max-age=3600),刷新时检查ETag或版本号,不匹配则请求服务器重新获取数据。
  4. 问:最终一致性中,冲突检测的具体实现?延迟对用户体验的影响?
    • 答:数据库更新时带版本号,冲突时按时间戳优先(较新记录覆盖旧记录),延迟约1-2秒,对于推荐列表的实时性影响较小,因为用户关注整体趋势。
  5. 问:高并发场景下,服务器如何处理请求量激增?比如懒加载和分页请求过多?
    • 答:服务器设置请求限流(如每秒1000次),使用Redis缓存热点数据,CDN分发静态资源,懒加载和分页降低初始请求量,缓解服务器压力。

7) 【常见坑/雷区】

  1. 视频流式加载未考虑CDN分片,导致视频加载卡顿,影响用户体验。
  2. 缓存未预热,用户首次访问时缓存未生效,导致首屏加载慢。
  3. 最终一致性未处理冲突,导致数据不一致,如用户点赞后推荐列表未更新。
  4. 懒加载触发条件不合理,如视口阈值过高或滚动速度阈值过低,导致频繁请求资源。
  5. 个性化分页未考虑用户行为预测,导致推荐内容不精准,影响用户留存。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1