字节跳动 软件开发三面凉经:项目难点连环追问与 Kafka、ES 深挖
- 轮次
- 三面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
三面
- 开局没有自我介绍,直接要求:挑一个能体现你能力和亮点的内容讲一下
- 项目讲完后追问:难点在哪?
- 性能提升在哪?为什么能提升?IO 是怎么降低的?应该答并发优化还是下游调用优化?
- 这个项目里用了 ES,ES 分页会不会漏数据?
- Kafka 性能为什么好?
- 磁盘顺序读写既然快,为什么不都用磁盘顺序读写?
- 零拷贝技术再介绍一下,调了哪些函数?
- 你了解不了解 PageCache?
- Kafka 怎么保证顺序消费?代码里怎么实现?
- 问内部的语言以及框架:容器用的是 tomcat 还是别的 servlet 容器?
- 算法题:矩阵转置
- 如何保证消息发到一个 partition?
《参考解析》
-
讲项目要先给业务场景,再上抽象名词:这次面试最大的卡点不是不会,而是面试官的反馈——「听不懂,你说人话」。技术叙事有个固定顺序:这是一个什么业务、原来的链路是什么样、瓶颈出现在哪一环、你怎么改的、改完指标变成什么样。抽象词(数据模型优化、领域建模)只在有具体动作支撑时才说,否则听起来就是背概念。
-
性能提升必须能拆到机制:TP99 从 1.5 秒降到 800 毫秒只是结果,面试官接着会问「怎么降的」。可能的来源就那么几类:减少 IO 次数(批量、合并查询)、并发化(把串行的下游调用改成并行)、减少下游调用数(缓存、去重、裁剪字段)、换存储或加索引、异步化非关键路径。答之前先把链路上的调用次数和耗时占比过一遍,能报出「原来 12 次 RPC,现在 3 次,其中 2 次并行」这种量级,才算答到位。
-
ES 深分页为什么会漏数据:
from + size的分页是协调节点向每个分片要前from + size条,再归并切片。分片返回的只是局部有序结果,当排序字段有重复值、或者跨分片归并时排序不稳定,翻页就可能出现重复或遗漏;同时index.max_result_window默认限制一万条。要翻深页应该用search_after(配合唯一排序键)、PIT 或 scroll。答这题时把「为什么会漏」和「替代方案」一起给出来,比只背结论好。 -
Kafka 高性能三件套要经得起反问:顺序写磁盘、PageCache 缓存、零拷贝(
sendfile,Java 侧是FileChannel.transferTo)。追问「既然顺序写快,为什么不都用顺序写」时,落点是读写模式不同——日志追加是纯顺序写,而查询要按 key 随机访问,顺序写在随机读上没有优势,所以还要靠索引和 PageCache 兜住读路径。 -
顺序消费要答到代码层面:Kafka 只保证单 partition 内有序,所以生产者侧按业务 key 做哈希选分区,让同一订单或同一用户的消息落到同一 partition;消费侧一个 partition 只交给一个消费者线程,要并发就得在消费端按 key 再分发(或者用内存队列按 key 路由),并配合幂等处理应对重试。被追问「强绑定是什么意思」时,用一句话解释清楚哈希与分区数的取模关系即可,不用绕。
-
压力面的正确姿势是确认粒度,而不是硬撑:面试官反复打断、要「调了哪些函数」这类细节,往往是在测你敢不敢承认边界。稳妥的做法是先复述一遍问题确认对方要的层级(原理、参数、还是某段代码),能答到哪层就答到哪层,答不上来直接说没写过、回去查,比硬编一个函数名安全。被否定时也不必当场争辩,把技术事实讲清楚,态度稳住,面评里「沟通」这一项就还有分。