字节跳动抖音架构后端一面(10.13)
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍
- 实习项目里,你负责了什么部分?是独立开发还是也完成了需求对齐?
- 实习项目上线以后,减少了多少人工重复维护的任务?有具体数据吗?
- 是如何避免同步故障阻断核心业务的?
- 失败的任务,修改失败的原因一般会有哪些?
- 单号冲突检验、催办功能,催办只是发送信息吗?
- 外部服务降级是平台做的吗?具体是怎么样的?
- 诊断工具开发和网易原有的工具相比怎么样?
- 你的项目里如果对消息队列进行选型和设计,你会考虑哪些方面(吞吐、消息堆积等)?
- 项目里如果在第一次发起请求返回 429 错误、再切换模型时,怎么避免重复生成和重复计费?
- 你怎么理解 MCP、Skill、Harness?
- 场景题:在浏览器里输入百度的域名,然后在百度搜索框输入关键词进行搜索,到最后页面显示,中间经过了哪些环节?
- 手撕:力扣 3 无重复字符的最长子串。
《参考解析》
项目陈述要给出量化收益与故障隔离口径:面试官追问「减少了多少人工维护任务」,考的是你能不能证明价值。准备时给每个项目算一条基线:改造前每周人工处理多少单、平均每单耗时多少、改造后降到多少,数据来自工单系统统计、日志计数或同事访谈(来源要说得清)。故障隔离要按层次讲:调用侧的超时与重试预算、熔断与降级开关(哪个外部依赖挂了走哪条兜底路径)、异步化(把同步链路里非必须的步骤挪到消息队列,避免下游抖动反压上游)、隔离舱(线程池/连接池按依赖拆分,防止一个依赖吃光资源)、以及开关与预案的演练记录。降级是谁做的要想清楚回答:平台侧通用能力(网关限流熔断、注册中心摘除)与业务侧定制兜底是两层,业务降级策略通常还得业务方定义并定期演练。
消息队列选型要考虑哪些维度:至少覆盖七项:吞吐与延迟(峰值 TPS、P99 延迟)、消息堆积能力(磁盘容量、堆积后的消费追平速度)、可靠性(持久化、副本、生产端确认、消费端手动 ack 与死信)、顺序性(是否需要全局有序还是按 key 局部有序,决定分区键怎么选)、投递语义(至少一次还是精确一次,配幂等消费)、运维与成本(集群规模、监控告警、扩容方式、跨机房容灾),以及生态特性(延迟消息、事务消息、消息回溯)。回答时最好结合业务给结论:订单/支付这类要事务消息与顺序的消息选中支持该能力的 MQ,日志与埋点这类高吞吐场景选 Kafka 风格。再补一句容量估算:按「峰值 TPS × 消息大小 × 保留天数」算存储,按「消费耗时 × 并发」算追平时间。
429 重试与切换模型时如何避免重复生成、重复计费:这其实是幂等与状态管理问题。做法是给每次用户请求生成一个全局唯一的请求指纹(会话 ID + 轮次 + 输入哈希 + 参数),在服务端落一张请求状态表(pending / streaming / succeeded / failed),并把已生成的内容分片持久化。收到 429 后切换模型重试时先查这张表:状态是 succeeded 就直接返回已有结果;是 streaming 就从断点续推,或者干脆整体重来但把先前这次标记为作废。计费侧永远按「已成功交付的结果」结算,以状态表的唯一键做幂等写入,重试次数与失败原因单独记录用于对账;若上游已经产生费用但结果不可用,走离线对账而不是给用户重复计费。还要注意流式响应已推送给客户端一部分的情况:客户端要能按「生成 ID + 分片序号」去重,服务端在切换模型前先发一个终止标记,避免用户看到两段拼接的答案。
MCP、Skill、Harness 怎么理解:用「能力供给—能力封装—运行承载」三层来讲最清楚。MCP(Model Context Protocol)是模型与外部工具/数据之间的标准协议,解决的是「工具怎么被统一描述、发现和调用」——把每个工具的参数 schema、返回格式、鉴权方式标准化,模型侧不需要为每个工具写一套适配。Skill 是在工具之上的任务级封装:把完成某类任务的步骤、提示词、脚本、检查清单打包成一个可复用的能力单元,让模型按流程走而不是每次自由发挥。Harness 是承载模型运行的外层框架:负责上下文组装、工具调用循环、权限与沙箱、日志与 trace、错误重试与额度控制,可以理解为「驱动模型干活的脚手架」。面试官追问时最好举个例子说明三者边界:同一把「查数据库」的工具通过 MCP 暴露,多个 Skill 复用它,Harness 决定谁能在什么条件下调用它并记录全过程。
场景题:从输入域名到搜索结果页显示:答题要按链路分层、每层说清做什么和可能出问题的地方。① 浏览器解析 URL,查缓存(浏览器 DNS 缓存、系统 hosts、本地 DNS 缓存),没有就走递归解析(根域名服务器 → 顶级域 → 权威服务器)拿到 IP,这一步可能走 DNS over HTTPS、也可能命中 CDN 的调度返回就近节点 IP。② 建立 TCP 连接(三次握手),HTTPS 还要 TLS 握手(证书校验、密钥协商,可能走 TLS 1.3 的 1-RTT 乃至会话复用),然后发出 HTTP 请求。③ 请求经 CDN / 四层与七层负载均衡 / 网关到达 Web 服务,做鉴权、限流、路由、静态资源判定。④ 服务端处理:读缓存(本地 + Redis),未命中走搜索服务——查询理解与改写、召回(倒排索引、向量)、粗排精排、结果聚合与摘要生成,再渲染模板。⑤ 响应返回浏览器,HTML 解析、构建 DOM/CSSOM 与渲染树,加载 JS/CSS/图片(可能又走一轮上述网络过程),执行 JS 渲染搜索结果,触发首屏指标。⑥ 期间还有缓存、Cookie、HTTP 版本与连接复用等细节。追问通常落在「哪一步最慢」「怎么优化」「CDN 缓存怎么失效」上。
手撕题的应对:力扣 3 无重复字符的最长子串是滑动窗口模板题:用左右指针维护一个窗口,右指针扩张并把字符计入窗口内位置,遇到重复字符时把左指针跳到「上次出现位置 + 1」(注意别回退左指针),过程中更新最大长度;也可以只用字符集计数数组,出现计数大于 1 就收缩左边界。要主动说复杂度:时间 O(n)、空间 O(字符集大小);边界包括空串、全部相同字符、含空格的字符串、以及字符集范围(ASCII 还是 Unicode)。写完后自己跑两三个用例再交。这轮作者提到算法题写得快反而招来第二题——实际建议是保持正常节奏、先说思路再动手、写完主动分析边界与复杂度,不必刻意拖延;项目问题答不上来才是真正掉分的地方,遇到不会的题可以讲清你的思路方向与你会怎么去查证,别硬编。