这篇文章整理的是字节跳动「推荐架构实习生-Data-抖音/直播/电商/剪映」岗位的面试准备路线。这个岗位不是纯推荐算法岗,更像是推荐场景下的后端架构、数据基础设施和 ML Infra 岗。
如果用一句话概括准备方向:不要只把自己包装成会调模型的推荐算法同学,而要展示成懂推荐业务、能做高并发架构和数据基础设施的工程型候选人。
岗位画像
岗位描述里反复出现几个关键词:
- 推荐系统开发
- 架构优化
- 大规模机器学习在线预估
- 实时计算系统
- 推荐特征中台
- 高并发、高吞吐、稳定性、可扩展性
- 多数据中心、全球化一体推荐系统
所以它重点考的不是单点知识,而是你能不能把推荐业务背后的在线链路、数据链路和工程稳定性串起来。
可以按下面六块准备:
| 模块 | 要准备到什么程度 |
|---|---|
| 编程与算法 | 至少一门语言熟练,算法题要有手感 |
| 计算机基础 | 数据结构、操作系统、网络、数据库 |
| 后端架构 | RPC、缓存、限流、熔断、降级、服务治理 |
| 推荐系统 | 召回、粗排、精排、重排、特征、样本、模型服务 |
| 数据链路 | Kafka、Flink、Spark、实时特征、离线特征 |
| 分布式系统 | 分片、副本、一致性哈希、多机房容灾 |
推荐系统整体链路
最基础的问题是:一个推荐请求从进来到返回,中间发生了什么?
标准链路可以这样讲:
请求进入推荐服务
-> 用户画像 / 上下文特征获取
-> 多路召回
-> 粗排
-> 精排模型打分
-> 重排 / 多样性 / 去重 / 业务规则
-> 返回结果
-> 曝光点击行为回流
-> 日志进入 Kafka
-> 实时 / 离线计算特征
-> 训练样本生成
-> 模型训练与发布
面试时要强调两条线:
- 在线链路:低延迟、高并发、高可用。
- 数据链路:行为日志回流、特征更新、训练样本构造、模型迭代。
推荐架构岗最关心的是两者如何协同。比如线上打分依赖特征服务,特征服务又依赖实时计算和离线计算,模型效果又依赖样本和特征口径的一致性。
召回、粗排、精排、重排
为什么推荐系统要拆成这么多阶段?
因为候选物品规模太大,不能对所有内容都用复杂模型打分。分阶段本质上是在效果、延迟和成本之间做权衡。
| 阶段 | 目标 | 特点 |
|---|---|---|
| 召回 | 从海量物品中快速取回几百到几千个候选 | 追求覆盖率,速度要快 |
| 粗排 | 用轻量模型过滤候选 | 平衡效果和延迟 |
| 精排 | 用复杂模型做精细打分 | 追求排序效果 |
| 重排 | 处理多样性、去重、频控、业务规则 | 让结果更适合最终展示 |
可以这样回答:
召回阶段解决从海量 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,让同一用户的消息进入同一个分区。
Flink 高频八股
Flink Exactly Once 怎么实现
核心是 checkpoint 和 sink 语义。
Flink 定期做 checkpoint
-> 保存算子状态和 source offset
-> 失败后从最近一次 checkpoint 恢复
-> sink 端通过两阶段提交或幂等写入保证不重复生效
面试时要补一句:Exactly Once 不是 Flink 单方面就能保证的,sink 也必须配合。
Watermark 是什么
Watermark 用来处理乱序事件时间。
可以这样讲:
Watermark 表示系统认为某个事件时间之前的数据基本已经到齐,可以触发窗口计算。由于实际数据可能乱序到达,所以 watermark 一般会允许一定延迟。如果迟到数据超过了 watermark,可以结合 allowed lateness 或侧输出流处理。
Redis 和缓存八股
缓存穿透、击穿、雪崩
| 问题 | 含义 | 解决方案 |
|---|---|---|
| 缓存穿透 | 查询不存在的数据,请求直接打到 DB | Bloom Filter、空值缓存、参数校验 |
| 缓存击穿 | 热点 key 失效,大量请求打到 DB | 互斥锁、逻辑过期、热点预热 |
| 缓存雪崩 | 大量 key 同时失效 | 过期时间加随机值、多级缓存、限流降级 |
Redis 常见数据结构
| 数据结构 | 推荐场景中的用法 |
|---|---|
| String | 普通缓存、计数器 |
| Hash | 用户画像、物品属性 |
| Set | 去重、兴趣集合 |
| ZSet | 排行榜、按时间排序 |
| Bitmap | 曝光记录、签到、布尔状态 |
| HyperLogLog | UV 粗略估算 |
| Stream | 轻量消息流 |
高并发服务治理
限流算法
| 算法 | 特点 |
|---|---|
| 固定窗口 | 简单,但窗口边界可能突刺 |
| 滑动窗口 | 更平滑,统计更准确 |
| 漏桶 | 稳定流出,削峰效果好 |
| 令牌桶 | 允许短时间突发,工程中很常用 |
熔断和降级
熔断和降级经常一起出现,但含义不一样:
- 熔断:下游持续异常时,主动切断调用,避免故障扩散。
- 降级:返回兜底结果,牺牲部分效果保证核心服务可用。
推荐系统的降级例子:
- 精排模型超时,退化为粗排结果。
- 个性化召回失败,退化为热门召回。
- 实时特征不可用,使用离线特征或默认特征。
- 重排服务异常,直接返回精排 TopN。
RPC 超时和重试
核心原则:
- 所有下游调用必须设置超时。
- 重试只适合幂等请求。
- 重试要限制次数,并使用退避策略。
- 避免重试放大流量导致雪崩。
- 核心链路要结合限流、熔断、降级。
面试可以这样说:
在推荐主链路里,一个请求可能 fan-out 到多个下游服务。如果没有超时和重试控制,慢下游会拖垮整个链路;如果盲目重试,又会把流量放大。因此我会给每个下游设置独立 timeout,只对幂等请求做有限重试,并配合熔断和降级保证主链路可用。
操作系统必背
推荐架构岗虽然偏业务系统,但 OS 基础仍然会问。
重点清单:
- 进程和线程区别。
- 用户态和内核态。
- 上下文切换。
- 虚拟内存。
- 分页和分段。
- 缺页中断。
- 堆和栈区别。
- 锁、互斥量、信号量、条件变量。
- 死锁四个条件。
select/poll/epoll区别。- 同步、异步、阻塞、非阻塞。
- 零拷贝。
epoll 怎么讲
标准回答:
select和poll每次都要把 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 3 | MySQL + Redis + 缓存问题 |
| Day 4 | Kafka + Flink + 实时计算 |
| Day 5 | 推荐系统架构 + 特征平台 |
| Day 6 | 分布式系统 + 高可用设计 |
| Day 7 | 项目复盘 + 模拟面试 |
如果还要进一步压缩优先级,最值得押注的是:
推荐系统链路
特征服务
Kafka / Flink 实时数据链路
Redis 缓存与去重
高并发服务治理
操作系统和网络基础
算法题手感
最后总结
这个岗位的核心不是「我懂推荐算法」,而是:
我理解推荐系统的在线链路和数据链路;
我知道大规模特征、样本、模型服务怎么支撑推荐业务;
我能从高并发、高可用、低延迟、可扩展的角度设计系统;
我能把业务逻辑抽象成稳定的工程组件。
面试表达上,要尽量把答案从单点八股提升到系统语境里。比如讲 Redis 不只讲数据结构,也讲曝光去重和特征缓存;讲 Kafka 不只讲消息队列,也讲行为日志回流;讲 Flink 不只讲 watermark,也讲实时特征;讲限流降级不只讲概念,也讲推荐主链路怎么兜底。
这就是推荐架构团队最想看到的工程能力。