小黑盒后端开发一面面经

小黑盒 · go开发 · 一面 · 2026-04

面试题目

  1. 请说一下 SSE 协议和 WebSocket 协议的区别。
  2. WebSocket 的端口和 HTTP 的端口是一样的吗?为什么?
  3. 端口这个概念是由哪一层提供的?
  4. 发送一个 HTTP 请求,从发送到接收中间发生了哪些过程?
  5. 什么是反向代理?正向代理和反向代理有什么区别?
  6. 你的社区项目中使用 Nginx 了吗?用到了哪些功能?
  7. WebSocket 是否支持 HTTP/2 或 HTTP/3?
  8. SSE 是基于 HTTP/1.1 的吗?
  9. 你的社区项目用了 HTTP/2 吗?
  10. 讲一下 IO 多路复用。
  11. 详细讲一下 epoll 的实现原理。
  12. 多路复用相对于非多路复用的优势是什么?
  13. epoll 底层为什么用红黑树而不是哈希表?
  14. 你在数据库项目中实现的死锁环路检测是怎么设计的?
  15. 如何选择回滚的事务?为什么不是任选一个?
  16. 如果让你设计一个选择代价最小的事务回滚,你会怎么决定代价?
  17. 除了资源数量,还有其他评估代价的方式吗?
  18. B+ 树是如何支持并发操作的?
  19. 写操作导致节点分裂时,如何保证并发安全?
  20. 你对 B+ 树做过单元测试或集成测试吗?压测过吗?
  21. 严格两阶段锁和两阶段锁的区别?
  22. 你的 WAL 日志是怎么实现的?
  23. 如果数据库崩溃,如何用 WAL 恢复数据?
  24. WAL 日志不断增长,有清理机制吗?
  25. 你在项目中的双层缓存设计(本地缓存 + Redis)具体是怎样的?
  26. 为什么用两层缓存?分别缓存了什么?
  27. 如果连接异常断开再重连,会有问题吗?
  28. 你的设计支持分布式吗?如果支持多个实例,如何保证回调能连接到正确的机器?
  29. 了解一致性哈希吗?请讲一下。
  30. Redis 是如何保证一致性的?
  31. Redis 的选举是怎么做的?用了什么算法?
  32. Redis Cluster 为什么是无中心的?既然用了 Raft 算法?
  33. 你有用过 Redis 的自动切换机制吗?
  34. 你在实习中做的向量召回,是用 ES 做的吗?
  35. 如果同时命中关键词和向量,如何融合排序?
  36. 你对 RRF 公式做过调优吗?
  37. 你在实习中参与向量召回的具体哪部分工作?
  38. 算法题:深度比较两个 Object(可能是 Map、List、String),用 Java 实现。
  39. 实习中有没有遇到过与导师意见不合的情况?怎么处理?
  40. 如果发现 bug 需要其他组协调,对方不承认,怎么办?
  41. 你使用过 AI 编程工具吗?优缺点?
  42. 你们公司有提供 AI 编程账号吗?使用多吗?

参考解析

  1. SSE vs WebSocket: SSE是单向长连接(服务器推),基于HTTP,简单轻量;WebSocket是双向全双工协议,有独立的握手过程,适合实时性要求极高的场景。
  2. IO多路复用与epoll: epoll通过事件驱动而非轮询,利用红黑树管理大量连接,双向链表存储就绪事件。相比哈希表,红黑树在有序遍历和查找效率(O(logN))上表现稳定,且在大规模并发下内存占用更可控。
  3. WAL恢复: 通过持久化的日志记录操作状态,系统崩溃重启后,按顺序重放日志中未持久化到数据页的事务,保证原子性和持久性。清理机制通常涉及Checkpoint(检查点),将日志中已提交并写入磁盘的部分截断。
  4. B+树并发控制: 采用Latch(闩锁)机制,包括读写锁或意向锁。在分裂操作时,通常需要对父节点加锁,或者采用B-link Tree算法通过兄弟指针减少锁竞争。
  5. 一致性哈希: 通过虚拟节点解决数据倾斜问题,在节点增减时只需迁移一小部分数据,常用于分布式缓存集群的负载均衡。