字节跳动 - AI搜索推荐后端开发
面试基本信息
- 日期: 2025-12-22
- 岗位描述
- 1.以 AI 技术为驱动,主导或参与信息流推荐、多模态搜索、智能内容中台建设;
- 2.参与亿级内容分发系统架构设计与优化,结合 AI 技术提升搜推一体化效果;
- 3.构建 AI 能力中台,解决内容理解、生成、合规等内容生态的共性技术需求;
- 4.参与 SaaS 应用的生产调优,解决大规模场景下系统的性能和稳定性问题。
- 面试时长: 45分钟
面试复盘
这个岗位从职责描述或者是任职要求上,应该是更偏向 AI 业务应用的搜推方向,面试整体过程中双方的 预期没有对齐,即没有想好要招什么人,也没想匹配对应的描述。更像是一个面向 校招的常规后端,没有任何 AI 方向的交流、也没有任何搜推方向的交流,也没有考虑到 社招 3-4 年背景 所需要考察的面试能力。还是希望面试的三方都做好对齐,找什么样的人,考察什么样的能力,提高筛选效率。
01 最近项目复盘
02 消息平台的消息分发如何确保 仅投递一次
核心思路
"仅投递一次"(Exactly-Once) 是消息分发的核心诉求,需从 生产端、中间件、消费端 三层设计保障,结合电商营销消息场景落地。
1. 生产端:幂等 + 事务保障消息不重复发送
- 本地事务表 + 消息队列双写:发送营销消息前,先在
MySQL写入 "消息发送日志"(含msg_id、状态=待发送、业务唯一标识),并与业务操作(如营销任务触发)放在同一事务 - 幂等发送:生产端为每条消息生成全局唯一
msg_id,发送前校验本地日志,避免重复提交;若发送超时,基于msg_id重试,保证消息至少投递到 MQ
2. 中间件:精准投递 + 状态追踪
- 选用支持 "消息轨迹 + 死信队列" 的 MQ(如
RocketMQ/Kafka) - 开启 MQ 的 "消息确认机制"(
Producer Ack),确保消息成功写入 MQ 集群 - 对未确认的消息,基于
msg_id做有限重试(如 3 次),失败则进入死信队列人工介入
3. 消费端:幂等处理 + 事务确认
这是 "仅投递一次" 的核心环节,营销消息推送场景落地如下:
- 消费幂等:消费端以
msg_id或 "业务唯一标识(如用户 ID + 营销活动 ID)" 为键,在Redis/MySQL中记录 "已消费" 状态,消费前先校验,避免重复处理 - 消费事务:消费端处理消息(如推送至邮件网关)后,先更新本地消费状态(已消费),再向 MQ 发送 "消费确认"(
ACK);若处理失败,不发送ACK,MQ 会重试投递 - 重试兜底:设置消费重试次数(如 5 次),超过次数则进入死信队列,避免无限重试导致重复投递
关键补充
营销消息推送允许 "最终一致",若极端场景下出现重复消息,可通过业务层去重兜底:比如用户收到重复推送时,前端展示层基于 "