1. HTTP 和 WebSocket 的区别
HTTP 通常是短连接,客户端发起一次请求,服务端返回一次响应后连接就结束了。而 WebSocket 是基于 TCP 的长连接通信,建立连接后,客户端和服务端都可以主动发送消息,支持全双工通信。WebSocket 在建立连接时底层也是先通过 HTTP协议升级的。相比 HTTP,WebSocket 更适合实时性要求高的场景,比如聊天系统、消息推送、在线协同和实时监控。
2.WebSocket 如何实现心跳机制
WebSocket 长连接下,如果客户端异常断开,服务端不一定能立即感知,所以一般会增加心跳机制。常见做法是客户端定时发送 ping,服务端返回 pong;或者服务端主动发送心跳包。如果连续多次没有收到响应,就认为连接已经失效,主动关闭连接并清理资源。这样可以避免无效连接长期占用内存和连接资源。
3.线程池方面的核心参数
- ThreadPoolExecutor 核心参数主要包括:
- corePoolSize 核心线程数
- maximumPoolSize 最大线程数
- keepAliveTime 非核心线程空闲存活时间
- 时间单位
- workQueue 任务队列
- threadFactory 线程工厂
- RejectedExecutionHandler 拒绝策略
线程池执行流程一般是:先创建核心线程,核心线程满后进入任务队列,队列满后再创建非核心线程,如果最大线程数也满了,就执行拒绝策略。企业里通常会根据任务类型合理配置线程池参数,避免线程过多导致 CPU 上下文切换严重。
4. Redis 的持久化机制
Redis 主要有两种持久化机制:RDB 和 AOF。RDB 是定时生成当前内存数据快照,保存成 dump.rdb 文件,优点是恢复速度快、文件小,但可能丢失最后一次快照后的数据。AOF 是记录每次写命令,恢复时重新执行命令,数据安全性更高,但文件更大。生产环境通常会同时开启 RDB 和 AOF,兼顾恢复速度和数据安全。
5. 说一下 Redis 哨兵
Redis Sentinel 主要用于实现 Redis 的高可用。它会持续监控主从节点状态,如果主节点宕机,Sentinel 会自动选举新的 Master,并通知其他从节点切换到新的主节点。这样客户端仍然可以继续访问 Redis 服务。Sentinel 核心能力包括:监控、自动故障转移、服务发现和通知告警。不过 Sentinel 主要解决的是高可用问题
6. 说一下 Spring AOP
这个之前讲了好多次了,不再赘述
7. JDK 动态代理和 CGLIB 动态代理
JDK 动态代理是基于接口实现的,要求目标类必须实现接口。而 CGLIB 是基于继承实现的,即使没有接口也可以代理。不过 final 类和 final 方法无法被 CGLIB 代理,因为它们不能被继承和重写。Spring 默认是:有接口优先使用 JDK 动态代理,没有接口再使用 CGLIB。
8. 索引的类型有哪些
老熟题了,不再赘述
9. 索引失效的场景
常见索引失效场景包括:
- 对索引列使用函数
- 索引列参与运算
- like '%xx' 前置模糊查询
- 联合索引没有遵循最左匹配原则
- 发生隐式类型转换
- 以及 or 条件部分字段没有索引
- where规则存在!=NULL这种情况
10. MCP 工具怎么写的
MCP 本质上是把外部工具能力标准化暴露给大模型
一般会包括:工具定义、参数 Schema、执行器以及结果返回。比如定义 rag_tool、search_tool、structured_query_tool,然后模型先进行 Tool Calling,系统执行对应工具后,再把结果返回给模型继续推理。核心其实是:工具注册、参数约束、上下文管理以及状态流转
11. RAG 里的 Rerank、多路召回
RAG 里通常会做多路召回,比如同时进行向量召回和关键词召回**。向量召回语义能力强,但精确匹配能力弱;关键词召回精确匹配能力强,但语义能力不足。**所以一般会通过 Score Fusion 做融合排序,再通过 Rerank 模型进一步精排。Rerank 会结合 Query、Chunk、标题命中、字段命中等特征重新计算相关性,这样可以明显提升最终 TopK 结果的准确率。
12. 多智能体是什么
多智能体可以理解成多个 Agent 分工协作完成复杂任务。每个 Agent 都有自己的角色、记忆、工具和目标,比如 Planner Agent 负责任务规划,Search Agent 负责检索,Code Agent 负责代码生成,最后再由 Coordinator Agent 汇总结果。相比单 Agent,多智能体更适合复杂任务拆解、多步骤协作以及长链路推理场景。
