系统设计之短视频评论系统(抖音)

Posted by BX on Sat, May 17, 2025

高并发评论系统设计(短视频场景)

本设计面向大厂系统设计面试,聚焦于高并发、热点控制、缓存机制、数据一致性、异步削峰、点赞与审核风控等核心能力,强调工程可行性与面试答题表达能力。

1. 核心目标 & 约束条件

✅ 核心目标

  • 支持亿级视频 + 百亿评论 + 亿级用户
  • 秒级热评展示、点赞实时更新、强抗压写入
  • 低成本可扩展、可观测、可运营干预

⚙️ 非功能约束

指标项指标描述
写入QPS峰值 20万/s(评论+点赞)
读取QPS峰值 50万/s(热评+翻页)
评论量总量百亿,单视频百万级
用户量活跃亿级
热点分布高频热点视频强倾斜

2. 数据模型与层级控制(面试关注高)

🧱 评论表设计

字段名类型说明
comment_idBIGINT主键,雪花 ID(全局唯一)
video_idBIGINT视频 ID,分库分表路由键
parent_idBIGINT父评论 ID(一级为 NULL)
user_idBIGINT评论用户 ID
contentTEXT文本内容
like_countINT点赞数(弱一致)
reply_countINT回复计数(仅一级评论维护)
statusTINYINT状态:0=正常 1=删 2=审核中
create_timeDATETIME创建时间

🔍 核心索引设计

索引名字段组合用途说明
PRIMARYcomment_id主键
idx_video_ctime(video_id, create_time DESC)视频评论时间倒序分页
idx_parent_id(parent_id)子评论查询
idx_user_id(user_id)用户维度管理/审计

🚫 嵌套层级控制(仅支持 2 层)

  • 业务写入层校验 parent_id:

    • 一级评论:parent_id = NULL
    • 二级回复:parent.parent_id = NULL,否则拒绝写入
    • 不依赖 DB 限制,仅靠逻辑校验

3. 写入架构(高并发 + 异步落库)

✍️ 评论写入

阶段处理逻辑
生成 ID接口层生成雪花 ID,写请求打入 MQ
落库 DB消费端按 video_id 分表落库
构建缓存评论内容以 JSON 结构写入 Redis
写穿透控制Redis 设置空值占位防止频繁穿透

👍 点赞写入

机制项技术手段
是否已点赞Redis SISMEMBER 判断用户是否已点赞
点赞计数INCR 计数缓存
热评排行Redis ZADD video:{id}:hot_comments
幂等保障使用 user_id+comment_id 做幂等 KEY
异步持久化MQ 投递,定时批量刷盘至 DB(弱一致性)

4. 缓存策略(命中率 + 热点抗压)

🧊 写穿透控制

  • 新评论写入后立刻构建缓存(或异步写)
  • Redis 缓存失效时写空值占位,防止击穿

🔥 热评缓存方案

类型方案说明
热评缓存结构Redis SortedSet,分桶缓存:hot_comments:video_id:N
聚合查询读取多个 ZSet 合并排序返回 TopN,结合本地热评列表缓存
多级缓存Redis 主层 + LRU 本地短时热存 + CDN 页面级缓存(可选)

5. 分库分表策略(可扩展 + 热点规避)

📦 路由与分片

层级分片策略
MySQL 表video_id 哈希分 512/1024 张表
热点视频可拆分为逻辑表 A/B/C,写时按 hash 再打散
Router 层自研路由中间件 or ShardingSphere 自动路由

🔁 查询聚合策略

  • UNION ALL + LIMIT 聚合分页
  • Redis 热评拆 key 合并 ZUNIONSTORE 聚合

6. 消息队列与幂等机制

📬 异步链路说明

阶段说明
生产端评论/点赞操作写入 MQ,ACK 机制确保可靠写入
消费端消费成功 ACK,否则重试 + 死信队列 DLQ
幂等处理消息携带 log_id/comment_id 保证写入不重复
重试策略支持幂等重试 + 最大失败次数 +告警落库

7. 评论排序逻辑(热度 / 时间)

🔢 排序类型说明

类型排序字段Redis 结构
最新排序create_time DESCList 或 Hash
热度排序score = 点赞+回复+时间衰减SortedSet

8. 评论审核与风控接口(C端重点)

🛡️ 审核流程

环节机制说明
内容审核第三方接口检测文本违规(涉黄、暴恐、政治)
频次风控接入风控平台,IP/UserAgent/行为特征识别机器人
灰度审核队列可疑内容进入人工队列,标记 pending,人工/异步审核决定展示

9. 评论数一致性(最终一致)

项目说明
实时计数Redis INCR 维护
DB 真实计数定期校对,使用日志反查、数据比对修正
写热点处理分桶 INCR + Lua 脚本避免并发丢写

10. 总结面试高频关注点

模块关键词
架构整体缓存、异步、削峰、最终一致性、热点打散
点赞设计Redis + 幂等 + 异步持久化 + ZSet 排行
缓存系统写穿透防护、多级缓存、SortedSet 热评、边车预热
分库分表video_id 分片、自研路由、热点视频多表、查询聚合优化
消息队列与幂等Kafka / RocketMQ、log_id 幂等、死信队列、重试策略
评论审核内容识别 API、风控接入点、灰度审核机制、状态字段隔离展示

🗣️ 附录:答题口播大纲(结构化表达模版)

面试时建议 3~5 分钟完整答题,围绕以下结构展开:

Step 1️⃣ 明确场景和挑战

  • 是短视频评论系统,写多读多,高并发
  • 目标支持亿级用户 + 热点视频百万级评论
  • 核心挑战是:写入高峰 + 点赞高频 + 热点倾斜 + 内容安全

Step 2️⃣ 描述核心模块设计(突出关键词)

  • 数据模型:parent_id 控制两层嵌套,视频维度分表,热点表逻辑拆分
  • 写入架构:Redis 抗压 + MQ 异步 + 雪花 ID + 幂等保障
  • 缓存策略:SortedSet 热评缓存,空值防穿透,边车预热 + 本地 LRU
  • 点赞机制:Set 判重,计数 + ZSet 排行,最终一致写入 DB
  • 审核风控:内容检测、频次识别、灰度队列,状态字段控制展示

Step 3️⃣ 扩展性与稳定性补充

  • 热点打散:评论写入表拆分 + Redis ZSet 分桶,查询合并
  • 分库路由:自研路由层 or 中间件 ShardingSphere
  • 数据一致性:评论数、点赞数定期对账 + Lua 分桶 INCR 防并发写丢

Step 4️⃣ 收尾总结 & 加分项

  • 系统整体保障了:高并发可用性、热点稳定性、内容安全合规
  • 可补充说:系统具备审计能力、运营干预接口、压测预案等实际工程要素