字节跳动后端开发一面面经
面试题目
- Guava Cache 和 Caffeine 分别使用了什么缓存淘汰算法?
- 实际项目里本地缓存命中率大概多少?
- 引入缓存带来的风险和解决方案?
- 缓存的读写策略?
- 如何保证缓存和数据库一致性?
- “先写缓存,再异步批量刷库”方案,除一致性外还有哪些潜在风险?
- 如何拦截恶意请求,设计防护手段避免缓存被恶意利用?
- 布隆过滤器原理,如何解决缓存穿透?
- 布隆过滤器误判概率大概多少,如何估计?
- 定时任务 5 分钟一轮询,任务执行超 5 分钟时,如何保证状态不丢失、不阻塞调度?
- 分布式 RPC 为什么要自定义协议,而不用 HTTP?
- 单机 QPS 1w+ 这个数据是怎么统计/得到的?
- RPC 项目目前瓶颈在哪?
- 了解哪些 HTTP 版本,各版本特性?
- HTTP 队头阻塞是什么?
- 队头阻塞是否只存在于 HTTP 层面?
- TCP 会不会存在对应阻塞问题?
- HTTP3 如何解决 HTTP2 在 TCP 上的队头阻塞?
- 为什么 HTTP3 基于 QUIC,而不继续在 TCP 上优化?
- TCP 如何实现可靠传输和流量控制?
- TCP 发送窗口如何根据接收窗口和拥塞情况动态调整,窗口结构如何维护变化?
- TCP 如何判断报文丢失,什么条件触发重传?
- TCP 除重传计时器外还有哪些计时器?
- AI 项目中降低大模型幻觉的具体优化方法?
- 大模型产生幻觉的底层技术原因?
- 算法题:Java 原生数组实现栈,实现常用操作。
参考解析
- 缓存淘汰算法:Guava 使用 LRU(最近最少使用);Caffeine 使用 W-TinyLFU(结合了频率和新鲜度,性能优于 LRU)。
- 缓存一致性:常用策略有先更新库再删除缓存、延时双删或使用 Canal 等中间件通过 binlog 异步更新缓存。
- 队头阻塞解决:HTTP2 的队头阻塞源于 TCP 的有序性要求;HTTP3 使用 QUIC 协议(基于 UDP),多个 Stream 独立传输,单个丢包不影响其他流。
- 大模型幻觉:产生原因主要是训练数据噪声及模型对长尾知识的不确定性。优化方法包括 RAG(检索增强生成)、Prompt Engineering 约束及强化学习(RLHF)。
- TCP 拥塞控制:通过慢启动、拥塞避免、快重传和快恢复算法,利用滑动窗口动态调整传输速度以适应网络负载。