所有文章

字节推荐架构实习生 Data 面试准备:推荐系统、实时特征与高并发八股

面向字节跳动推荐架构团队实习岗位的八股准备清单,覆盖推荐系统链路、实时数据、特征服务、高并发后端、分布式系统与项目包装。

这篇文章整理的是字节跳动「推荐架构实习生-Data-抖音/直播/电商/剪映」岗位的面试准备路线。这个岗位不是纯推荐算法岗,更像是推荐场景下的后端架构、数据基础设施和 ML Infra 岗。

如果用一句话概括准备方向:不要只把自己包装成会调模型的推荐算法同学,而要展示成懂推荐业务、能做高并发架构和数据基础设施的工程型候选人。

岗位画像

岗位描述里反复出现几个关键词:

  • 推荐系统开发
  • 架构优化
  • 大规模机器学习在线预估
  • 实时计算系统
  • 推荐特征中台
  • 高并发、高吞吐、稳定性、可扩展性
  • 多数据中心、全球化一体推荐系统

所以它重点考的不是单点知识,而是你能不能把推荐业务背后的在线链路、数据链路和工程稳定性串起来。

可以按下面六块准备:

模块要准备到什么程度
编程与算法至少一门语言熟练,算法题要有手感
计算机基础数据结构、操作系统、网络、数据库
后端架构RPC、缓存、限流、熔断、降级、服务治理
推荐系统召回、粗排、精排、重排、特征、样本、模型服务
数据链路Kafka、Flink、Spark、实时特征、离线特征
分布式系统分片、副本、一致性哈希、多机房容灾

推荐系统整体链路

最基础的问题是:一个推荐请求从进来到返回,中间发生了什么?

标准链路可以这样讲:

请求进入推荐服务
  -> 用户画像 / 上下文特征获取
  -> 多路召回
  -> 粗排
  -> 精排模型打分
  -> 重排 / 多样性 / 去重 / 业务规则
  -> 返回结果
  -> 曝光点击行为回流
  -> 日志进入 Kafka
  -> 实时 / 离线计算特征
  -> 训练样本生成
  -> 模型训练与发布

面试时要强调两条线:

  1. 在线链路:低延迟、高并发、高可用。
  2. 数据链路:行为日志回流、特征更新、训练样本构造、模型迭代。

推荐架构岗最关心的是两者如何协同。比如线上打分依赖特征服务,特征服务又依赖实时计算和离线计算,模型效果又依赖样本和特征口径的一致性。

召回、粗排、精排、重排

为什么推荐系统要拆成这么多阶段?

因为候选物品规模太大,不能对所有内容都用复杂模型打分。分阶段本质上是在效果、延迟和成本之间做权衡。

阶段目标特点
召回从海量物品中快速取回几百到几千个候选追求覆盖率,速度要快
粗排用轻量模型过滤候选平衡效果和延迟
精排用复杂模型做精细打分追求排序效果
重排处理多样性、去重、频控、业务规则让结果更适合最终展示

可以这样回答:

召回阶段解决从海量 item 中找候选的问题,追求召回率;粗排阶段用更便宜的模型做快速过滤;精排阶段使用复杂模型提升排序效果;重排阶段结合多样性、去重、频控和业务约束,保证最终列表既有效果也有体验。

在线推荐服务如何优化性能

推荐在线链路一般会有严格的 P99 延迟要求。一个请求里可能要访问用户画像、物品特征、多个召回服务、模型预估服务、规则服务。如果串行调用,很容易超时。

常见优化方向:

  • 缓存:用户特征缓存、物品特征缓存、召回结果缓存、模型结果缓存。
  • 并行:多路召回并发执行,特征并发拉取,下游 RPC 并发调用。
  • 超时控制:每个下游设置 timeout,超时后走降级。
  • 批量化:模型预估 batch 推理,减少单次调用开销。
  • 索引优化:倒排索引、向量索引、embedding 检索。
  • 模型优化:蒸馏、量化、特征裁剪、轻重模型分层。
  • 服务治理:限流、熔断、降级、负载均衡、灰度发布。

回答时最好带上指标:

QPS
P95 / P99 latency
缓存命中率
下游超时率
模型预估耗时
召回耗时
特征拉取耗时

面试官如果追问「P99 延迟突然升高怎么排查」,可以按链路拆:

入口网关
  -> 推荐主服务排队耗时
  -> 用户特征服务耗时
  -> 召回服务耗时
  -> 排序模型服务耗时
  -> Redis / KV / DB 耗时
  -> 下游 RPC 超时和重试

先看监控和 trace,把总耗时拆到每个阶段,再定位是单个下游慢、缓存失效、网络抖动、负载不均,还是重试导致流量放大。

推荐系统如何去重

推荐场景的去重通常有几层:

  • 曝光去重:用户近期看过的内容不再推荐。
  • 内容去重:相似视频、重复商品、搬运内容降权或过滤。
  • 作者去重:同一作者短时间内不连续出现太多。
  • 类目去重:同类内容控制频次,保证多样性。
  • 业务去重:广告、直播、电商商品等有额外规则。

实现方式:

方式适用场景
Redis Set小规模准确去重
Bitmap用户行为是否发生过,空间效率高
Bloom Filter大规模快速判断,允许少量误判
用户历史行为表长周期曝光、点击、购买记录
实时特征最近 N 分钟 / N 小时行为统计

Bloom Filter 可以这样讲:

Bloom Filter 空间效率高,适合判断一个 item 是否可能出现过。它有误判但没有漏判,因此适合大规模曝光过滤这类场景。如果误判导致少量未曝光内容被过滤,通常业务可以接受。

特征服务是什么

特征服务是推荐系统里非常核心的中台能力。

它负责为在线推荐链路提供:

  • 用户特征:年龄、兴趣、历史行为、长期偏好、短期偏好。
  • 物品特征:内容类目、作者、商品价格、embedding、质量分。
  • 上下文特征:时间、位置、设备、网络、场景入口。
  • 交叉特征:用户与物品之间的匹配关系,比如用户对某类内容的点击率。

可以这样回答:

特征服务连接离线计算、实时计算和在线预估服务。它的核心要求是低延迟、高吞吐、特征口径一致、可回溯、可监控。推荐链路的模型效果很依赖特征质量,而在线服务的稳定性也很依赖特征服务的可用性。

特征服务常见难点:

  • 在线和离线特征不一致。
  • 特征延迟过高,影响推荐实时性。
  • 热点用户或热点物品访问量过大。
  • 特征维度多,存储和拉取成本高。
  • 特征版本变更影响模型兼容性。
  • 缺失值、异常值、分布漂移难以及时发现。

实时特征和离线特征如何保证一致

这是推荐架构岗很容易加分的问题。

核心答案:

  • 统一特征定义,避免训练和线上各写一套逻辑。
  • 统一样本口径,曝光、点击、转化等事件定义要一致。
  • 特征版本管理,模型依赖的特征版本要可追踪。
  • 离线回放校验,用历史日志回放实时计算逻辑。
  • 监控特征分布漂移,比如均值、方差、缺失率、Top 值变化。
  • 训练和在线尽量复用同一套 feature transform 逻辑。

可以总结成一句:

推荐系统里最怕 training-serving skew,也就是训练时看到的特征和线上服务时使用的特征口径不一致。解决思路是统一特征定义、统一计算逻辑、做版本管理,并通过离线回放和线上监控持续校验。

Kafka 高频八股

Kafka 为什么快

Kafka 快主要靠:

  • 顺序写磁盘。
  • 利用 Page Cache。
  • 零拷贝 sendfile
  • 分区并行。
  • 批量发送。
  • 追加写日志结构。

标准回答:

Kafka 并不是完全不落盘,而是通过顺序写把磁盘写入变成高吞吐操作。同时它充分利用操作系统 Page Cache,消费时可以通过零拷贝减少用户态和内核态之间的数据拷贝。再加上分区并行和批量发送,所以吞吐很高。

Kafka 如何保证消息不丢

按生产者、Broker、消费者三段回答:

Producer:
  acks=all
  开启重试
  开启幂等生产者

Broker:
  多副本机制
  min.insync.replicas
  合理配置 replication.factor

Consumer:
  处理完成后再提交 offset
  业务侧幂等消费
  必要时使用事务或去重表

Kafka 如何保证顺序

一句话:

Kafka 只能保证单分区内有序,多分区之间不保证全局顺序。如果要保证某个用户维度有序,可以用 user_id 作为 key,让同一用户的消息进入同一个分区。

核心是 checkpoint 和 sink 语义。

Flink 定期做 checkpoint
  -> 保存算子状态和 source offset
  -> 失败后从最近一次 checkpoint 恢复
  -> sink 端通过两阶段提交或幂等写入保证不重复生效

面试时要补一句:Exactly Once 不是 Flink 单方面就能保证的,sink 也必须配合。

Watermark 是什么

Watermark 用来处理乱序事件时间。

可以这样讲:

Watermark 表示系统认为某个事件时间之前的数据基本已经到齐,可以触发窗口计算。由于实际数据可能乱序到达,所以 watermark 一般会允许一定延迟。如果迟到数据超过了 watermark,可以结合 allowed lateness 或侧输出流处理。

Redis 和缓存八股

缓存穿透、击穿、雪崩

问题含义解决方案
缓存穿透查询不存在的数据,请求直接打到 DBBloom Filter、空值缓存、参数校验
缓存击穿热点 key 失效,大量请求打到 DB互斥锁、逻辑过期、热点预热
缓存雪崩大量 key 同时失效过期时间加随机值、多级缓存、限流降级

Redis 常见数据结构

数据结构推荐场景中的用法
String普通缓存、计数器
Hash用户画像、物品属性
Set去重、兴趣集合
ZSet排行榜、按时间排序
Bitmap曝光记录、签到、布尔状态
HyperLogLogUV 粗略估算
Stream轻量消息流

高并发服务治理

限流算法

算法特点
固定窗口简单,但窗口边界可能突刺
滑动窗口更平滑,统计更准确
漏桶稳定流出,削峰效果好
令牌桶允许短时间突发,工程中很常用

熔断和降级

熔断和降级经常一起出现,但含义不一样:

  • 熔断:下游持续异常时,主动切断调用,避免故障扩散。
  • 降级:返回兜底结果,牺牲部分效果保证核心服务可用。

推荐系统的降级例子:

  • 精排模型超时,退化为粗排结果。
  • 个性化召回失败,退化为热门召回。
  • 实时特征不可用,使用离线特征或默认特征。
  • 重排服务异常,直接返回精排 TopN。

RPC 超时和重试

核心原则:

  • 所有下游调用必须设置超时。
  • 重试只适合幂等请求。
  • 重试要限制次数,并使用退避策略。
  • 避免重试放大流量导致雪崩。
  • 核心链路要结合限流、熔断、降级。

面试可以这样说:

在推荐主链路里,一个请求可能 fan-out 到多个下游服务。如果没有超时和重试控制,慢下游会拖垮整个链路;如果盲目重试,又会把流量放大。因此我会给每个下游设置独立 timeout,只对幂等请求做有限重试,并配合熔断和降级保证主链路可用。

操作系统必背

推荐架构岗虽然偏业务系统,但 OS 基础仍然会问。

重点清单:

  • 进程和线程区别。
  • 用户态和内核态。
  • 上下文切换。
  • 虚拟内存。
  • 分页和分段。
  • 缺页中断。
  • 堆和栈区别。
  • 锁、互斥量、信号量、条件变量。
  • 死锁四个条件。
  • select / poll / epoll 区别。
  • 同步、异步、阻塞、非阻塞。
  • 零拷贝。

epoll 怎么讲

标准回答:

selectpoll 每次都要把 fd 集合从用户态传到内核态,并线性遍历所有 fd,连接数大时开销很高。epoll 把 fd 注册到内核,事件就绪后加入就绪队列,应用只需要取就绪事件,更适合大规模连接场景。

计算机网络必背

重点清单:

  • TCP 三次握手、四次挥手。
  • TCP 如何保证可靠传输。
  • 拥塞控制:慢启动、拥塞避免、快重传、快恢复。
  • TIME_WAIT 为什么存在。
  • HTTP/1.1、HTTP/2、HTTP/3 区别。
  • HTTPS 握手过程。
  • DNS 解析过程。
  • 长连接和短连接。
  • 负载均衡策略。

推荐服务里可以这样关联:

推荐链路涉及多个下游 RPC 调用,网络延迟会直接影响整体 P99。因此工程上需要连接池、超时控制、并发请求、服务发现、负载均衡和降级策略。

数据库与存储

MySQL 索引为什么快

InnoDB 使用 B+ 树索引。

核心点:

  • B+ 树层高低,磁盘 IO 次数少。
  • 非叶子节点只存 key,扇出高。
  • 叶子节点有序,适合范围查询。
  • InnoDB 聚簇索引叶子节点存整行数据。

聚簇索引和非聚簇索引

可以这样回答:

InnoDB 的主键索引是聚簇索引,叶子节点存整行数据。二级索引的叶子节点存主键值,如果查询字段不在二级索引里,需要根据主键再查一次聚簇索引,这个过程叫回表。

MVCC 是什么

MVCC 通过版本链和 Read View 实现并发读写。读操作可以读取历史版本,减少读写锁冲突。InnoDB 在可重复读隔离级别下通过 MVCC 保证同一个事务内多次快照读结果一致。

LSM Tree 适合什么场景

LSM Tree 常见于 RocksDB、LevelDB,也经常出现在高吞吐写入、特征存储、状态后端里。

写入先进入 MemTable
  -> 刷盘成 SSTable
  -> 后台 Compaction 合并

优点是写入性能高,缺点是读可能需要查多层结构,所以通常配合 Bloom Filter、索引块和 Compaction 优化。

分布式系统

CAP

CAP 分别是:

  • C:一致性。
  • A:可用性。
  • P:分区容错性。

分布式系统必须考虑网络分区,所以通常是在 CP 和 AP 之间权衡。

面试时不要只背定义,要能落到场景:

推荐系统里,用户曝光去重、计数、特征更新很多时候可以接受最终一致性;但账户、支付、权限这类数据就更偏强一致。不同数据要按业务后果选择一致性模型。

一致性哈希

一致性哈希解决节点变化导致大量 key 迁移的问题。

普通 hash:

hash(key) % N

当节点数 N 改变,大量 key 都会重新映射。

一致性哈希把节点和 key 映射到同一个 hash 环上,节点增删时主要影响相邻区间。虚拟节点可以缓解数据倾斜。

多机房推荐系统

岗位描述里提到「多数据中心」和「全球化一体推荐系统」,可以准备一版回答:

用户请求就近接入
  -> 本地机房提供在线推荐服务
  -> 用户近期行为本地实时写入
  -> 关键数据跨机房同步
  -> 非关键特征最终一致
  -> 故障时流量切换到其他机房

关键词:

  • 就近访问。
  • 多活部署。
  • 流量调度。
  • 数据同步。
  • 跨机房延迟。
  • 故障切换。
  • 最终一致性。
  • 核心数据强一致,非核心数据最终一致。

算法题准备方向

字节实习很看算法,不能只背八股。

重点题型:

  • 数组:双指针、滑动窗口、前缀和。
  • 链表:反转、合并、环检测。
  • 栈队列:单调栈、括号匹配。
  • 二叉树:DFS、BFS、最近公共祖先。
  • 图:拓扑排序、最短路、并查集。
  • 堆:TopK、合并 K 路。
  • 动态规划:背包、子序列、区间 DP。
  • 字符串:滑动窗口、哈希,KMP 可了解。

推荐必刷:

  • LRU Cache。
  • Top K 高频元素。
  • 合并 K 个有序链表。
  • 最长无重复子串。
  • 接雨水。
  • 岛屿数量。
  • 课程表。
  • 二叉树层序遍历。
  • 最长递增子序列。
  • 编辑距离。
  • 买卖股票。

项目包装模板

推荐架构岗很喜欢听系统性表达。讲项目时不要只说「我实现了某功能」,要讲清楚背景、架构、难点、优化和结果。

模板:

项目背景:解决什么业务问题?
系统架构:有哪些模块?数据怎么流动?
我的职责:负责哪块?
技术难点:高并发、延迟、数据一致性、存储压力、可用性?
优化方案:用了什么缓存、异步、批处理、索引、分片、降级?
结果指标:延迟降低多少、吞吐提升多少、资源节省多少?
复盘:如果重做,会怎么改?

推荐架构岗加分词:

P99 延迟
QPS
吞吐
缓存命中率
数据一致性
实时性
幂等
可观测性
降级
灰度发布
A/B 实验
特征回流
样本构造

自我介绍模板

可以按这个版本改:

面试官您好,我是 XXX,目前是 2027 届计算机相关专业学生。

我主要熟悉 XXX 语言,基础方面比较重视数据结构、操作系统、网络和数据库。项目上我做过 XXX,涉及到高并发服务 / 数据处理 / 推荐相关模块。在这个项目中,我主要负责 XXX,重点解决了 XXX 问题,比如通过缓存、异步处理、批量写入、限流降级等方式优化系统性能。

我对推荐系统背后的工程架构比较感兴趣,尤其是在线预估、实时特征、数据回流和高可用服务这些方向。这个岗位和我的兴趣比较匹配,所以希望有机会深入参与大规模推荐系统架构的研发。

7 天冲刺路线

如果时间只有一周,可以这样安排:

时间重点
Day 1算法高频题 + 复杂度分析
Day 2操作系统 + 网络
Day 3MySQL + Redis + 缓存问题
Day 4Kafka + Flink + 实时计算
Day 5推荐系统架构 + 特征平台
Day 6分布式系统 + 高可用设计
Day 7项目复盘 + 模拟面试

如果还要进一步压缩优先级,最值得押注的是:

推荐系统链路
特征服务
Kafka / Flink 实时数据链路
Redis 缓存与去重
高并发服务治理
操作系统和网络基础
算法题手感

最后总结

这个岗位的核心不是「我懂推荐算法」,而是:

我理解推荐系统的在线链路和数据链路;
我知道大规模特征、样本、模型服务怎么支撑推荐业务;
我能从高并发、高可用、低延迟、可扩展的角度设计系统;
我能把业务逻辑抽象成稳定的工程组件。

面试表达上,要尽量把答案从单点八股提升到系统语境里。比如讲 Redis 不只讲数据结构,也讲曝光去重和特征缓存;讲 Kafka 不只讲消息队列,也讲行为日志回流;讲 Flink 不只讲 watermark,也讲实时特征;讲限流降级不只讲概念,也讲推荐主链路怎么兜底。

这就是推荐架构团队最想看到的工程能力。