news 2026/1/14 16:05:28

字节三面挂了!问 “抖音关注流怎么设计”,我答 “推模式”,面试官:顶流大V发一条视频,你打算写 1 亿次 Redis?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
字节三面挂了!问 “抖音关注流怎么设计”,我答 “推模式”,面试官:顶流大V发一条视频,你打算写 1 亿次 Redis?

昨晚一个 6 年经验的粉丝在群里复盘字节跳动架构面,心态崩了。

面试官问了一个非常核心的业务场景题:“抖音/微博的‘关注流’(Feed Stream),用户发视频,粉丝刷视频。如果让你来设计这个系统,你怎么做?

这哥们觉得这题熟,自信地回答:“这不就是消息通知吗?用**‘推模式’(Push)!每个用户维护一个 Redis List(收件箱)。A 发了视频,就遍历 A 的所有粉丝,把视频 ID 推送到粉丝的 List 里。粉丝读取时,直接查自己的 List,速度极快。”

面试官听完,冷笑了一声,追问: “推模式读确实快。但如果某顶流大V发了一条视频,他有 1 亿粉丝。 按照你的方案,你需要瞬间发起 1 亿次 Redis 写入。哪怕你用了 MQ 削峰、Redis Pipeline 批量写,写入延迟和资源消耗也是巨大的。 这意味着,该大V发了视频,粉丝可能要几分钟后才能看到,而且这期间 Redis 集群可能因为写热点产生抖动。这能上线吗?

这哥们瞬间哑口无言,才意识到自己掉进了“写扩散”的深坑。

兄弟们,Feed 流架构 是大厂面试的“试金石”。 它没有标准答案,只有“最适合业务场景的取舍”

今天 Fox 带你拆解这道题的 3 种段位,看看亿级流量的社交系统是怎么搭建的。

一、 为什么 “单纯的推/拉” 都是死路?

在设计 Feed 流时,我们面临两个核心概念:Inbox(收件箱)Outbox(发件箱)

  1. 纯拉模式(Pull / 读扩散):

  • 逻辑:大V发视频,只存自己的 Outbox。粉丝要看时,去遍历自己关注的 2000 个博主 的 Outbox,把最新视频拉取回来,在内存中排序。

  • 死穴: 读延迟极高。 如果你关注了 2000 人,每次刷新都要查 2000 次数据库/缓存,再做聚合排序,接口响应起码几秒钟,用户早卸载了。

  1. 纯推模式(Push / 写扩散):

  • 逻辑:也就是这哥们答的方案。发视频时,主动推送到所有粉丝的 Inbox。

  • 死穴: 大 V 延迟。 对于千万级粉丝的大 V,发一条动态的成本是天价(写放大),导致资源耗尽。

结论:纯拉模式死于“高关注用户(海王)”,纯推模式死于“大 V 用户(顶流)”。必须搞混合架构!

二、 核心架构:3 种主流解法(从青铜到王者)

解法 1:全量推模式(适合微信朋友圈)—— 青铜段位

如果面试官问的是“微信朋友圈”,那你答“推模式”是满分。

为什么?

因为微信主打“强关系、小圈子”。微信限制了好友上限(比如 5000 人)。 即使你加满了好友,发一条朋友圈,最多也就是写 5000 次 Redis,这对于后台来说毫无压力**。

架构:

  • 写:写入自己的 Outbox + 异步推送给所有好友的 Inbox。

  • 读:直接读自己的 Inbox(Redis ZSet),性能 O(1)。

Fox 点评:业务场景决定架构。微信的“封闭性”决定了推模式是体验最好的。

解法 2:推拉结合(Hybrid 模式)—— 黄金段位

如果面试官问的是“微博/抖音”这种“开放式、有大 V”的平台,必须上混合模式。

核心逻辑: 普通人用“推”,大 V 用“拉”

流程推演:

  1. 判断身份:用户发布视频时,系统判断其粉丝量。

  • 普通用户(粉丝 < 50W): 走推模式。直接把 Feed ID 写入所有粉丝的 Inbox。

  • 大 V(粉丝 > 50W): 走拉模式。只写入自己的 Outbox,不推送。

  1. 读取逻辑:粉丝请求 Feed 流时,系统执行“混合查询”:

  • 第一步:读取粉丝自己的 Redis Inbox(这里面有普通好友的动态)。

  • 第二步:读取粉丝关注的“大 V 列表”,并发去拉取这些大 V 的 Outbox。

  • 第三步:将 Inbox 数据 + 大 V Outbox 数据,在内存中按时间戳归并排序(Merge Sort)

  • 第四步:返回给前端。

Fox 点评:这是业界标准解法。既保证了普通用户的实时性,又解决了大 V 发博的写放大问题。

解法 3:存储分层 + 粉丝分层(生产级架构)—— 王者段位

真实的亿级流量系统(如抖音),光靠简单的推拉结合还不够,必须考虑存储成本和极致性能

1. 存储分层(解决 Redis 贵的问题):Redis 内存太贵了,存不下全量 Feed 流。

  • 接入层:API 网关 + 流量路由。

  • 缓存层(Redis Cluster):只存热点 Feed(最近 7 天)和活跃用户的 Inbox。

  • 持久层(HBase / ByteKV):存储全量 Feed 数据和冷数据。Redis 没命中时,再去查持久层。

2. 粉丝分层(解决“拉”性能问题):针对大 V,不能对所有粉丝都“拉”,也不能对所有粉丝都“不推”。

  • 铁粉(高频互动):走推模式。即使是大 V,也给这部分核心粉丝推 Inbox,保证体验。

  • 普通粉/僵尸粉:走拉模式。

  • 大 V 聚合池:对于拉模式,粉丝不是去遍历 100 个大 V 的 Outbox,而是去查询一个“大 V 聚合索引池”(由后台异步聚合热点大 V 内容),一次 I/O 拿到所有大 V 动态。

3. 推荐流融合:关注流不再纯按时间排序,而是融合推荐算法。

  • 双列召回:关注流召回 + 推荐流召回。

  • 统一 Rank:根据互动率、视频质量进行加权重排,最后输出给用户。

三、 最后的“防杠”指南(扫清死角)

设计完架构,面试官会追问这 3 个实战死角,答不上来也是挂:

Q1:Feed 流的分页怎么做?用 limit offset 吗?

答:“绝对不能用 limit offset(深分页问题)。

标准做法:使用 Max_ID(瀑布流) 方式。

前端传给后端:last_feed_id(上一页最后一条的 ID)。

后端查询:Select ... WHERE id < last_feed_id ORDER BY id DESC LIMIT 10。 Redis ZSet 中使用 ZREVRANGEBYSCORE 实现。”

Q2:混合模式下,关注了大 V 多了,拉取还是很慢怎么办?

答:“用‘大 V 聚合池’优化。 系统后台会维护一个‘热点大 V 内容池’(或者用 ES 索引)。 粉丝刷新时,不是去遍历 2000 个大 V 的 Outbox,而是直接读这个聚合池。相当于把‘多次读’变成了‘一次读’,极大降低了 I/O 开销。”

Q3:用户删除了视频,怎么同步给粉丝?

答:“采用‘读时修复’策略。 写扩散模式下,回撤成本太高。我们只在元数据层把状态改为 deleted。 粉丝读取 Inbox 拿到 ID 后,会去查元数据详情(此时通常走 Cache),发现状态是 deleted,则在读取端直接过滤掉。后台再起异步任务慢慢清理无效的 Inbox 数据。”

四、 面试标准答案模板(建议背诵)

下次被问到“Feed 流架构”或“推拉模式”,直接按这个套路输出:

“对于 Feed 流架构,必须根据业务场景和粉丝量级来定:

  1. 业务定性:微信朋友圈(双向小圈子)走全量推模式;微博/抖音(单向大 V)走推拉结合

  2. 核心架构:

  • 普通用户:推模式(写 Inbox)。

  • 大 V 用户:拉模式(写 Outbox)+ 粉丝分层策略(铁粉推,路人拉)。

  1. 存储优化:考虑到成本,我采用冷热分离。热数据存 Redis,全量历史数据存 HBase/ByteKV。

  2. 性能兜底:引入大 V 聚合池优化拉取性能,并配合Max_ID瀑布流分页,确保亿级流量下的丝滑体验。”

https://mp.weixin.qq.com/s/zhAb84ufJty-QlqqGweGdg

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/10 10:40:49

隐私保护合规设计:GDPR等法规遵循的技术实现

隐私保护合规设计&#xff1a;GDPR等法规遵循的技术实现 在医疗影像系统中训练一个AI模型来增强CT图像的可视化效果&#xff0c;听起来是个不错的创新点。但如果这些数据涉及患者隐私&#xff0c;而你又不能把它们上传到云端进行训练——怎么办&#xff1f;这正是全球成千上万企…

作者头像 李华
网站建设 2026/1/14 11:24:37

掌握这5种技术,让你的C++网络模块性能提升10倍

第一章&#xff1a;C网络模块性能优化的背景与意义在现代高性能服务器和分布式系统中&#xff0c;C因其对底层资源的精细控制能力&#xff0c;成为构建高并发网络服务的首选语言。随着互联网业务规模的不断扩张&#xff0c;用户请求量呈指数级增长&#xff0c;传统的同步阻塞式…

作者头像 李华
网站建设 2026/1/14 9:52:00

手把手教学:使用lora-scripts在PyCharm中完成Stable Diffusion风格LoRA训练

使用 lora-scripts 在 PyCharm 中完成 Stable Diffusion 风格 LoRA 训练 在如今的生成式 AI 浪潮中&#xff0c;Stable Diffusion 已成为图像创作领域的核心工具。但面对“如何让模型学会我的艺术风格&#xff1f;”这一问题&#xff0c;大多数人会被复杂的微调流程劝退——直到…

作者头像 李华
网站建设 2026/1/14 6:08:04

C++物理引擎性能优化实战:如何将计算耗时降低90%(内部技术揭秘)

第一章&#xff1a;C物理引擎性能优化实战&#xff1a;从理论到实践在开发高性能的实时模拟系统或游戏时&#xff0c;C物理引擎的效率直接决定了整体体验的流畅性。面对复杂的碰撞检测、刚体动力学计算和约束求解&#xff0c;必须采用系统性的优化策略来降低CPU开销并提升帧率稳…

作者头像 李华
网站建设 2026/1/10 0:41:45

方剂配伍规律总结:人工智能辅助中医药研究

方剂配伍规律总结&#xff1a;人工智能辅助中医药研究 在智能技术席卷各行各业的今天&#xff0c;中医药这一传承千年的医学体系也正悄然经历一场静默而深刻的变革。过去依赖师徒口传心授的经验积累&#xff0c;如今正在被数据驱动的智能模型逐步解析与重构。尤其是中药方剂中“…

作者头像 李华