小黑盒后端开发一面面经
面试题目
- 请说一下 SSE 协议和 WebSocket 协议的区别。
- WebSocket 的端口和 HTTP 的端口是一样的吗?为什么?
- 端口这个概念是由哪一层提供的?
- 发送一个 HTTP 请求,从发送到接收中间发生了哪些过程?
- 什么是反向代理?正向代理和反向代理有什么区别?
- 你的社区项目中使用 Nginx 了吗?用到了哪些功能?
- WebSocket 是否支持 HTTP/2 或 HTTP/3?
- SSE 是基于 HTTP/1.1 的吗?
- 你的社区项目用了 HTTP/2 吗?
- 讲一下 IO 多路复用。
- 详细讲一下 epoll 的实现原理。
- 多路复用相对于非多路复用的优势是什么?
- epoll 底层为什么用红黑树而不是哈希表?
- 你在数据库项目中实现的死锁环路检测是怎么设计的?
- 如何选择回滚的事务?为什么不是任选一个?
- 如果让你设计一个选择代价最小的事务回滚,你会怎么决定代价?
- 除了资源数量,还有其他评估代价的方式吗?
- B+ 树是如何支持并发操作的?
- 写操作导致节点分裂时,如何保证并发安全?
- 你对 B+ 树做过单元测试或集成测试吗?压测过吗?
- 严格两阶段锁和两阶段锁的区别?
- 你的 WAL 日志是怎么实现的?
- 如果数据库崩溃,如何用 WAL 恢复数据?
- WAL 日志不断增长,有清理机制吗?
- 你在项目中的双层缓存设计(本地缓存 + Redis)具体是怎样的?
- 为什么用两层缓存?分别缓存了什么?
- 如果连接异常断开再重连,会有问题吗?
- 你的设计支持分布式吗?如果支持多个实例,如何保证回调能连接到正确的机器?
- 了解一致性哈希吗?请讲一下。
- Redis 是如何保证一致性的?
- Redis 的选举是怎么做的?用了什么算法?
- Redis Cluster 为什么是无中心的?既然用了 Raft 算法?
- 你有用过 Redis 的自动切换机制吗?
- 你在实习中做的向量召回,是用 ES 做的吗?
- 如果同时命中关键词和向量,如何融合排序?
- 你对 RRF 公式做过调优吗?
- 你在实习中参与向量召回的具体哪部分工作?
- 算法题:深度比较两个 Object(可能是 Map、List、String),用 Java 实现。
- 实习中有没有遇到过与导师意见不合的情况?怎么处理?
- 如果发现 bug 需要其他组协调,对方不承认,怎么办?
- 你使用过 AI 编程工具吗?优缺点?
- 你们公司有提供 AI 编程账号吗?使用多吗?
参考解析
- SSE vs WebSocket: SSE是单向长连接(服务器推),基于HTTP,简单轻量;WebSocket是双向全双工协议,有独立的握手过程,适合实时性要求极高的场景。
- IO多路复用与epoll: epoll通过事件驱动而非轮询,利用红黑树管理大量连接,双向链表存储就绪事件。相比哈希表,红黑树在有序遍历和查找效率(O(logN))上表现稳定,且在大规模并发下内存占用更可控。
- WAL恢复: 通过持久化的日志记录操作状态,系统崩溃重启后,按顺序重放日志中未持久化到数据页的事务,保证原子性和持久性。清理机制通常涉及Checkpoint(检查点),将日志中已提交并写入磁盘的部分截断。
- B+树并发控制: 采用Latch(闩锁)机制,包括读写锁或意向锁。在分裂操作时,通常需要对父节点加锁,或者采用B-link Tree算法通过兄弟指针减少锁竞争。
- 一致性哈希: 通过虚拟节点解决数据倾斜问题,在节点增减时只需迁移一小部分数据,常用于分布式缓存集群的负载均衡。