news 2026/6/9 21:23:32

字节三面挂了!问 “抖音关注流怎么设计”,我答 “推模式”,面试官:顶流大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/6/9 21:09:41

超详细配置说明:lora-scripts中batch_size、lora_rank等参数调优建议

超详细配置说明&#xff1a;lora-scripts中batch_size、lora_rank等参数调优建议 在如今生成式AI快速普及的背景下&#xff0c;越来越多的开发者和创作者希望用自己的数据微调Stable Diffusion或大语言模型&#xff08;LLM&#xff09;&#xff0c;实现风格化输出、IP形象定制甚…

作者头像 李华
网站建设 2026/6/8 12:49:44

如何用lora-scripts自动标注图片prompt?auto_label.py脚本使用详解

如何用 lora-scripts 自动标注图片 prompt&#xff1f;auto_label.py 脚本使用详解 在 AIGC 创作日益普及的今天&#xff0c;越来越多设计师、艺术家和开发者希望训练属于自己的 LoRA 模型——无论是复刻某种艺术风格&#xff0c;还是定制特定角色形象。但一个现实问题是&#…

作者头像 李华
网站建设 2026/5/31 20:05:07

【C++26新特性抢先看】:constexpr变量全面升级,编译期性能提升3倍的秘密

第一章&#xff1a;C26 constexpr变量的演进与意义C 标准的持续演进不断强化编译时计算能力&#xff0c;而 C26 中对 constexpr 变量的进一步扩展标志着这一趋势的重要里程碑。该版本允许更多类型的变量在常量表达式上下文中被求值&#xff0c;显著提升了模板元编程和泛型库的设…

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

C++多线程同步机制全解析(涵盖自旋锁、信号量与futex底层实现)

第一章&#xff1a;C多线程同步机制概述在现代高性能应用程序开发中&#xff0c;多线程编程已成为提升计算效率的关键手段。然而&#xff0c;多个线程并发访问共享资源时&#xff0c;若缺乏有效的同步机制&#xff0c;极易引发数据竞争、状态不一致等问题。C11 标准引入了丰富的…

作者头像 李华
网站建设 2026/5/21 3:38:39

数字人直播带货:24小时不间断的销售终端

数字人直播带货&#xff1a;24小时不间断的销售终端 在电商直播竞争日益白热化的今天&#xff0c;品牌方越来越意识到一个现实问题&#xff1a;真人主播再能说会道&#xff0c;也扛不住每天8小时高强度输出&#xff0c;更别提跨时区全球直播的需求。观众凌晨三点打开直播间&…

作者头像 李华
网站建设 2026/6/9 20:39:03

实时仿真系统效率难题,一文掌握C++物理引擎的高并发处理秘诀

第一章&#xff1a;实时仿真系统效率难题的根源剖析实时仿真系统在工业控制、自动驾驶、航空航天等领域扮演着关键角色&#xff0c;其核心要求是在严格的时间约束下完成计算任务。然而&#xff0c;多数系统在实际运行中面临效率瓶颈&#xff0c;导致响应延迟、资源浪费甚至仿真…

作者头像 李华