跳转到内容

Scenario 19: TikTok 短视频推荐

V1 — 1人用:纯前端全屏滑动播放

Section titled “V1 — 1人用:纯前端全屏滑动播放”

你想做一个短视频Demo,手机上全屏滑动切换视频,类似TikTok的体验。

  • 全屏竖屏视频播放
  • 上下滑动切换(CSS scroll-snap)
  • 硬编码视频URL列表,无需后端
  • 自动播放当前视频,离开时暂停

用HTML+CSS+JS做一个短视频播放页面。视频URL硬编码在JS数组里(用公开的mp4链接)。 全屏竖屏布局,CSS scroll-snap实现上下滑动切换。当前可见的视频自动播放, 滑走后暂停。显示简单的点赞按钮(计数存localStorage)。移动端优先。

  • 全屏滑动流畅,snap到每个视频
  • 当前视频自动播放,离开暂停
  • 点赞状态持久化到localStorage
  • 移动端体验正常
  • CSS scroll-snap 实现分页滑动 → Module: CSS布局
  • IntersectionObserver 检测可见性 → Module: 浏览器API
  • 视频播放控制 → Module: HTML5 Media

V2 — 10人用:视频上传+元数据管理

Section titled “V2 — 10人用:视频上传+元数据管理”

小团队想上传自己的短视频,需要后端存储视频文件和元数据。

  • 视频文件上传(限制大小和格式)
  • SQLite存储视频元数据(标题、上传者、时长)
  • 按上传时间倒序的Feed API
  • 视频文件本地存储

Go+Gin后端,SQLite数据库。实现视频上传API(POST /api/videos,multipart), 限制100MB以内,只接受mp4/webm。文件存到 data/videos/ 目录。 元数据存SQLite(id, title, filename, uploader, duration, created_at)。 GET /api/feed 返回按时间倒序的视频列表。前端用V1的滑动播放器展示。

  • 视频上传成功,文件保存到本地
  • 格式和大小校验正确拒绝
  • Feed API返回正确的视频列表
  • 前端能播放上传的视频
  • 文件上传处理 → Module: HTTP文件处理
  • SQLite基本操作 → Module: 嵌入式数据库
  • 静态文件服务 → Module: Web服务基础

V3 — 100人用:推荐Feed+视频转码

Section titled “V3 — 100人用:推荐Feed+视频转码”

用户增多,需要基本的推荐逻辑和视频格式统一。

  • PostgreSQL存储用户、视频、标签
  • 简单推荐:70%热门 + 30%随机(避免信息茧房)
  • 视频转码为统一格式(720p H.264)
  • 视频标签系统

将SQLite迁移到PostgreSQL。视频表增加 tags, view_count, like_count 字段。 推荐Feed API:70%按热度(view_count加权)取视频,30%随机取,去重后返回20条。 视频上传后用ffmpeg异步转码为720p H.264 mp4(Go exec.Command调用)。 转码状态字段:pending/processing/done/failed。前端只展示done状态的视频。

  • 推荐Feed混合了热门和随机内容
  • 上传的视频被转码为统一格式
  • 转码失败有错误状态记录
  • 标签筛选功能正常
  • 简单推荐算法设计 → Module: 推荐系统入门
  • ffmpeg视频转码 → Module: 多媒体处理
  • 异步任务处理 → Module: 后台任务

用户行为数据积累,需要根据个人偏好推荐内容。

  • 记录用户行为:观看时长、完播率、点赞、分享
  • 用户兴趣标签画像(基于行为加权)
  • 基于标签相似度的个性化推荐
  • Redis缓存热门视频和用户画像

新增用户行为表(user_id, video_id, watch_duration, completed, liked, shared, created_at)。 前端上报观看行为(视频播放>3秒记录,完播/点赞/分享记录)。 用户画像:根据行为加权计算标签偏好(完播权重3,点赞权重2,观看权重1), 存Redis Hash。推荐算法:60%标签匹配 + 20%热门 + 20%探索。 Redis缓存Top100热门视频列表,每10分钟更新。

  • 行为数据正确记录
  • 用户画像反映真实偏好
  • 推荐内容与用户兴趣相关
  • 仍有20%探索内容避免茧房
  • 用户行为收集 → Module: 埋点系统
  • 用户画像构建 → Module: 用户建模
  • 基于内容的推荐 → Module: 推荐算法

V5 — 1万人用:实时推荐+多路召回

Section titled “V5 — 1万人用:实时推荐+多路召回”

用户规模大,需要实时响应行为变化,推荐系统需要更复杂的架构。

  • Kafka收集用户行为流,实时更新特征
  • 多路召回:热门召回、标签召回、协同过滤召回
  • 召回结果合并+排序(简单打分模型)
  • 推荐结果预计算+实时修正

行为事件发送到Kafka topic(user-events)。消费者实时更新Redis中的用户特征。 多路召回实现:1)热门召回(Redis ZSET top视频) 2)标签召回(用户Top5标签的视频) 3)协同过滤召回(相似用户喜欢的视频,基于Jaccard相似度)。 每路召回50条,合并去重后按分数排序取Top30。分数=召回分0.5+新鲜度0.3+质量分*0.2。 已看过的视频过滤(Bloom Filter)。推荐列表预生成存Redis,请求时直接返回。

  • 行为事件实时流入Kafka
  • 三路召回各自返回合理结果
  • 合并排序逻辑正确
  • Bloom Filter有效过滤已看内容
  • 推荐延迟<100ms
  • 消息队列实时处理 → Module: Kafka
  • 多路召回架构 → Module: 推荐系统架构
  • Bloom Filter去重 → Module: 概率数据结构

V6 — 10万+用户:全球分发+A/B测试

Section titled “V6 — 10万+用户:全球分发+A/B测试”

面向全球用户,视频需要就近分发,推荐策略需要持续迭代。

  • 多CDN视频分发(按地域选择最近节点)
  • 边缘缓存热门视频,冷门视频回源
  • A/B测试框架:推荐算法对比实验
  • 冷启动优化:新用户快速建立画像

视频上传后推送到CDN(模拟多CDN:cdn-us, cdn-eu, cdn-asia),返回就近URL。 热门视频(Top1000)预热到所有CDN节点,冷门视频按需回源。 A/B测试:用户分桶(user_id % 100),不同桶用不同推荐策略, 记录每组的完播率/点赞率/留存率。Dashboard展示实验数据对比。 冷启动:新用户前10个视频用热门+多样化策略,根据前5次互动快速收敛偏好。

  • 不同地域用户获得就近CDN链接
  • 热门视频CDN缓存命中率>90%
  • A/B测试分桶稳定,数据对比清晰
  • 新用户10次互动后推荐明显个性化
  • 推荐策略可热更新,无需重启
  • CDN分发策略 → Module: 内容分发网络
  • A/B测试框架 → Module: 实验平台
  • 冷启动问题 → Module: 推荐系统优化