Skip to content

Fullstack_System 面试专题手册

💡 本章节共收录 1494 道面试真题,建议每天复习 10-20 题。


Q1: Redis在你两次同步到数据库里突然挂了怎么办?

【核心解析】 Redis持久化机制(RDB、AOF);数据丢失风险评估;故障恢复流程(从持久化文件恢复、主从切换);同步重试与幂等性设计;监控与告警策略


Q2: 项目中流式通信是如何实现的?SSE和WebSocket有什么区别?

【核心解析】 流式通信常用SSE或WebSocket;SSE单向服务器推送,基于HTTP,更轻量;WebSocket全双工,适合高频双向通信;根据场景选择,如对话流式输出多用SSE。


Q3: 如何为大模型设计一个数据加载器?请说出你的思路。

【核心解析】 需求分析:支持多种数据格式(文本、图像、音频)、大规模数据高效加载、与训练框架集成;核心设计:数据读取(并行I/O、内存映射)、预处理(tokenization、图像变换)、批处理(动态padding、bucketing)、数据增强;性能优化:多进程/多线程加载、预取(prefetch)、缓存机制、分布式数据分片(DistributedSampler);易用性:配置化(YAML/JSON)、插件化支持自定义处理、监控(数据加载耗时、吞吐量);容错:异常数据跳过、断点续训支持


Q4: 如果设计一个大型Agent系统,整体架构你会怎么分层设计?

【核心解析】 通常分为接入层(API网关、身份验证)、调度层(任务分发、负载均衡)、核心层(LLM推理、记忆管理、工具调用)、数据层(向量数据库、关系数据库、缓存);各层解耦,通过消息队列异步通信;考虑多租户隔离、弹性伸缩和容灾;引入监控和日志系统用于调试和审计。


Q5: 如果让你设计智能体与大模型相关的分布式系统,会从哪些方面进行综合考量?

【核心解析】 系统架构(微服务划分、API网关);可扩展性(水平扩展、负载均衡);数据一致性(分布式缓存、消息队列);容错与高可用(重试机制、降级策略);监控与日志(追踪LLM调用链、性能指标);成本控制(缓存策略、模型选择)


Q6: 传统高并发和Agent高并发设计

【核心解析】 传统高并发:线程池、异步IO、负载均衡;Agent高并发:LLM推理的延迟与吞吐量权衡;请求队列与批处理策略;模型服务化与弹性伸缩;状态管理在并发下的挑战;缓存与预计算优化


Q7: 上下文窗口怎么设计?如何降低 token 消耗?怎么评测设计的质量?

【核心解析】 设计滑动窗口、摘要压缩、记忆分级等机制;降低 token 可通过 prompt 精简、选择性上下文注入、使用更高效的 tokenizer;评测质量需关注任务完成度、响应相关性、延迟与成本。


Q8: SSE连接很多时,后端为什么容易出问题,怎么做连接治理?

【核心解析】 SSE长连接对文件描述符、线程/协程、内存缓冲等资源的消耗;慢客户端导致写缓冲积压与内存拖垮;连接数限制、心跳、超时、断开感知、消息队列缓冲上限和任务取消等治理手段;网关超时、关闭代理缓冲、按用户或租户限流等生产实践


Q9: RabbitMQ的消息确认、持久化和幂等分别解决什么问题?

【核心解析】 消息确认解决消费者处理完成与否的可靠性,手动ack与nack/reject的机制;消息持久化解决Broker重启时消息不丢,需队列持久化、消息持久化及刷盘策略;幂等解决消息重复投递问题,通过业务唯一键或消费日志去重;三者边界清晰,生产系统按至少一次投递设计


Q10: IoC和AOP分别解决什么问题,它们在Spring里是怎么落地的?

【核心解析】 IoC解决对象创建与依赖管理问题,通过容器管理Bean的生命周期与依赖注入;AOP解决横切逻辑复用问题,将日志、事务等织入目标方法;Spring中IoC基于BeanDefinition和BeanFactory,AOP通过JDK动态代理或CGLIB实现;事务注解是典型AOP场景


Q11: 为什么 RAG 项目在生产后端主链路选择 Java 而不是 Python?

【核心解析】 Java 在服务治理、线程池隔离、连接池、限流、监控、事务、权限和工程规范上更成熟;与公司现有 Spring Cloud、MySQL、Redis、MQ、网关等体系集成更容易;生产 RAG 链路不仅包括 embedding 和向量检索,还涉及文档解析、切分、索引构建、权限过滤、召回融合、rerank、prompt 组装、模型调用、流式返回和结果审计;Java 负责主链路更易做稳定性治理;Python 可保留在离线清洗、模型实验或特征处理侧


Q12: 线程池在 Agent 项目中用于哪些场景?参数如何设置?

【核心解析】 线程池用于模型调用、文档切分、向量索引构建、规则解释生成、异步审计落库和消息消费等场景;参数设置需区分 CPU 密集型和 IO 密集型任务;CPU 密集型线程数接近核心数,IO 密集型可设更高但需配合队列长度、超时和拒绝策略;按任务类型拆分线程池(如模型调用池、检索池、审计落库池、消息消费池)以避免相互影响;示例中模型调用池核心线程 16、最大线程 64、队列 500、拒绝策略为 CallerRunsPolicy


Q13: TransmittableThreadLocal 解决了什么问题?在项目中如何使用?

【核心解析】 普通 ThreadLocal 在线程池场景下因任务提交线程和执行线程不同导致上下文丢失;InheritableThreadLocal 对线程池不可靠,因为线程池线程预先创建,不会每次继承父线程变量;TransmittableThreadLocal 解决线程池任务提交时上下文捕获和执行时恢复的问题;可将提交线程的上下文包装进 Runnable 或 Callable,执行时恢复,执行后清理,避免上下文串号;示例中用于传递 traceId


Q14: Spring Boot自动配置原理是什么?Starter为何能引入依赖即生效?

【核心解析】 核心是条件装配;Starter包含依赖和自动配置类;自动配置类通过@AutoConfiguration、@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty等注解判断环境;早期通过spring.factories加载,新版使用META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。


Q15: Redis 是单线程的,为什么它还能支持高并发?

【核心解析】 Redis 核心命令执行主要是单线程,基于内存操作和高效数据结构,配合 IO 多路复用处理大量连接事件,避免锁竞争,命令执行路径短;新版本在网络 IO、持久化、异步释放、集群同步等方面使用多线程或后台线程;高并发能力关键在于避免阻塞事件循环,如大 key、慢 Lua、全量扫描、复杂集合运算和持久化抖动都会导致延迟飙升。


Q16: 在实际业务场景中,你怎么判断什么时候需要加缓存,为什么不能只用 MySQL?

【核心解析】 加缓存通常因访问频率高、读多写少、计算代价高、数据允许短暂不一致或下游承载不了高并发;适合缓存的数据如商品基础信息、类目规则、运营 SOP、用户短期会话、Agent 任务状态和热点榜单;MySQL 适合事务和持久化,但不擅长高频低延迟热点读、分布式限流、临时会话状态和短期幂等标记;只用 MySQL 易导致热点 SKU 或活动期间连接池打满;缓存设计需考虑过期时间、穿透、击穿、雪崩、一致性和降级。


Q17: SSE是怎么实现的,服务端和客户端分别要做什么

【核心解析】 SSE基于HTTP长连接,服务端推送文本事件流;客户端使用EventSource API发起连接;服务端设置Content-Type: text/event-stream;消息格式:event、id、data字段,空行分隔;适用场景:AI流式输出、进度推送;与WebSocket的对比;Nginx代理需关闭缓冲


Q18: Redis为什么性能强?请讲解Redis的单线程模型。

【核心解析】 基于内存操作,避免磁盘I/O;单线程避免上下文切换和锁竞争;IO多路复用机制(epoll);高效数据结构设计;单线程模型下的注意事项(如耗时操作阻塞)


Q19: 为什么选择RocketMQ?有没有了解过其他消息队列?如何进行消息队列的选型?

【核心解析】 RocketMQ特性(高吞吐、低延迟、事务消息);与其他MQ对比(Kafka、RabbitMQ、ActiveMQ);选型考虑因素(性能、可靠性、功能、社区、运维成本);业务场景匹配(如金融级可靠性)


Q20: RocketMQ和Kafka的区别有哪些?

【核心解析】 架构设计差异(如Kafka的partition vs RocketMQ的queue);消息可靠性(同步刷盘、主从复制);功能特性(事务消息、延迟消息);适用场景(日志处理 vs 业务消息);性能与扩展性对比


Q21: MySQL的原子性和持久性底层是如何保证的?

【核心解析】 原子性通过undo log实现回滚;持久性通过redo log和binlog保证;WAL(Write-Ahead Logging)机制;两阶段提交(2PC)保证redo log和binlog一致;崩溃恢复流程


Q22: 在一个事务中,执行读写读操作,哪里需要加锁?什么时候解锁?为什么写完不能立即解锁?

【核心解析】 读操作加共享锁(S锁),写操作加排他锁(X锁);两阶段锁协议(2PL),锁在事务结束时释放;写完不能解锁是为了保证可重复读和避免幻读;MVCC机制减少锁冲突


Q23: MySQL中text字段(如10000个字符)如何处理?字段长度在1000-10000之间如何选择类型?

【核心解析】 VARCHAR与TEXT的区别(存储位置、索引限制);VARCHAR最大长度65535字节,需考虑字符集;TEXT类型存储溢出页,影响性能;根据实际长度和查询需求选择合适类型;前缀索引优化


Q24: 什么时候需要分库分表?除了减少数据库连接数,分库还有什么好处?

【核心解析】 数据量过大、高并发写入瓶颈;分库分表策略(垂直拆分、水平拆分);分库好处:分散存储压力、提高可用性、隔离业务;分库带来的问题(分布式事务、跨库查询);中间件如ShardingSphere


Q25: 线程池的好处是什么?ThreadLocal的原理及内存泄露原因?异步线程除了导致ThreadLocal丢失,还会有什么问题?

【核心解析】 线程池优点:复用线程、控制并发、管理生命周期;ThreadLocal实现线程隔离,底层ThreadLocalMap;内存泄露原因:key为弱引用,value强引用未清理;异步线程问题:上下文传递丢失、数据污染、OOM风险


Q26: 请介绍Java中的NIO及其核心组件。

【核心解析】 NIO与BIO的区别及非阻塞特性;Buffer、Channel、Selector三大核心组件;多路复用的工作原理;NIO在网络编程中的应用场景。


Q27: 请介绍分布式事务的实现原理。

【核心解析】 分布式事务的CAP与BASE理论;两阶段提交(2PC)与三阶段提交(3PC);TCC、Saga等柔性事务方案;分布式事务在微服务中的实践与挑战。


Q28: 前端、后端与Agent开发三者的职能差异是什么?

【核心解析】 前端关注用户界面与交互;后端关注业务逻辑、数据存储与API;Agent开发关注智能决策、工具调用与自主任务执行;三者协作模式(Agent作为后端服务或独立层);Agent开发需融合AI模型与工程化


Q29: 如何保证Redis分布式锁的可靠性,节点宕机怎么办?

【核心解析】 Redis分布式锁的实现(如SETNX+过期时间);Redlock算法原理;节点宕机时的锁安全性问题(如主从切换导致锁丢失);使用Redisson等客户端处理续期与容错


Q30: 为什么用Redis Set去重?

【核心解析】 Redis Set的数据结构特性(无序、唯一);去重场景(如消息队列幂等、爬虫URL去重);与布隆过滤器的对比;内存占用与性能考量


Q31: Redis + Token的分布式会话如何实现的?

【核心解析】 Token生成与验证流程;Redis存储会话信息(如用户ID、权限);会话过期与续期机制;分布式环境下的会话一致性保证


Q32: SSE和WebSocket的区别,SSE具体怎么实现的,后端什么时候推送,前端如果断连怎么处理?

【核心解析】 SSE与WebSocket的对比(单向/双向、协议、适用场景);SSE实现原理(HTTP长连接、事件流格式);后端推送时机(数据更新、事件触发);前端断连处理(自动重连、事件ID、错误处理);SSE的浏览器兼容性与局限性


Q33: 请描述一个完整的RAG系统离线链路和在线链路的技术架构。

【核心解析】 离线链路:文档抓取、OCR、正文抽取、表格解析、标题树构建、chunk切分、embedding计算、倒排索引和向量索引构建;在线链路:query清洗、意图识别、多路召回(如制度问答、历史工单、接口文档)、权限过滤、去重、rerank、上下文压缩、LLM生成、引用校验、敏感信息过滤、结构化字段提取、日志与反馈回流;技术栈:Python、FastAPI、Elasticsearch、Milvus、Redis、PyTorch、Transformers、vLLM。


Q34: 在RAG系统中,不同数据如何存储?如原始文档、向量索引、会话状态等。

【核心解析】 原始文档和附件使用对象存储以保留版本和回溯;向量索引存储在Milvus等向量数据库;会话状态、热点缓存、prefix cache等业务侧key存储在Redis;存储选型需考虑访问模式、延迟、成本等因素。


Q35: 讲讲乐观锁在 Redis 和 MySQL 中的实现,以及数据读写顺序问题。

【核心解析】 乐观锁基于版本号或 CAS 操作,假设冲突少,提交时检查;Redis 可使用 WATCH + MULTI/EXEC 事务或 Lua 脚本实现乐观锁;MySQL 通过版本号字段或时间戳实现乐观锁;读写顺序:先读数据,业务处理,再带条件写回;读写不一致可能因并发导致,需原子操作或锁机制。


Q36: Redisson 分布式锁的原理是什么?

【核心解析】 基于 Redis 的 SETNX 和过期时间实现互斥锁;使用 Lua 脚本保证加锁和设置过期的原子性;通过看门狗机制自动续期,防止业务超时锁释放;利用 Redis 的发布订阅实现锁释放通知;支持可重入、公平锁等高级特性。


Q37: 为什么选择 RocketMQ 而不是 RabbitMQ 或其他消息中间件?它有什么优势?

【核心解析】 RocketMQ 支持高吞吐、低延迟,适合大规模数据处理;支持事务消息和顺序消息,保证分布式事务一致性;原生支持分布式集群,扩展性强;RabbitMQ 基于 AMQP,功能丰富但吞吐量较低;RocketMQ 更适用于电商、金融等场景。


Q38: 如果发生了超卖问题,该怎么处理?

【核心解析】 使用分布式锁或数据库乐观锁控制并发扣减库存;引入消息队列异步处理订单,削峰填谷;设置库存缓存,通过 Lua 脚本原子扣减;增加库存校验和回滚机制;监控报警,及时人工介入。


Q39: 生产者消费者模型中,如果消费者获取信息失败该怎么办?

【核心解析】 消费者捕获异常,根据业务决定重试或丢弃;重试需设置最大次数和退避策略,避免雪崩;将失败消息发送到死信队列,后续人工处理;记录日志并监控,及时发现问题;保证消费者幂等性,避免重复消费。


Q40: 了解LangChain和LangGraph吗?它们有什么区别?

【核心解析】 LangChain是用于构建LLM应用的框架,提供链、代理、工具等抽象;LangGraph专注于构建有状态、多步骤的代理工作流,支持循环和条件分支;LangGraph基于图结构定义流程,更灵活地处理复杂交互;两者可结合使用,LangChain提供组件,LangGraph编排流程。


Q41: RocketMQ和LLM应用对JVM GC的压力有什么不同?

【核心解析】 RocketMQ对低延迟和高吞吐的要求,GC调优侧重避免长暂停;LLM应用常驻大对象多,GC压力在于堆外内存和直接缓冲区管理;两者在内存分配模式和对象生命周期上的差异


Q42: 有没有对JVM进行过调优?请分享经验。

【核心解析】 GC日志分析与监控工具;堆大小与代比例调整;GC收集器选择(如G1、ZGC);内存泄漏排查;JIT编译优化


Q43: Redis的安全问题有哪些?Redis是否有无密码的情况,这种情况有什么安全问题?

【核心解析】 Redis默认无密码,暴露在公网易被未授权访问;无密码可能导致数据泄露、篡改、删除;攻击者可利用Redis写入SSH公钥或计划任务获取服务器权限;安全措施包括设置强密码、绑定内网IP、启用ACL、禁用危险命令、使用TLS加密通信;定期审计配置和日志。


Q44: Redis为什么快?过期数据如何自动删除?

【核心解析】 基于内存操作,避免磁盘I/O;单线程模型避免上下文切换和锁竞争;高效的数据结构(如跳表、压缩列表);IO多路复用机制;过期键删除策略:惰性删除、定期删除、定时删除


Q45: 场景题:如果用二级缓存做一个展示商品信息的业务,那么本地缓存和Redis中分别存什么数据?

【核心解析】 本地缓存:存储热点数据、访问频率极高的商品基本信息,减少网络开销,如商品标题、价格;Redis缓存:存储全量商品数据或相对冷门的数据,作为分布式缓存保证数据一致性;缓存更新策略:采用旁路缓存模式,先更新数据库再删除缓存;数据一致性:通过设置合理的过期时间或使用消息队列通知更新;本地缓存与Redis的协作:本地缓存未命中时查询Redis,Redis未命中则回源数据库。


Q46: 前后端之间怎么解决消息延迟,高并发下如何避免用户接收消息不及时的问题

【核心解析】 使用WebSocket长连接;消息队列异步解耦;服务端推送技术;负载均衡与水平扩展;客户端轮询降级策略


Q47: 如果推理时出现 OOM,你会怎么排查?

【核心解析】 分析显存占用来源:模型参数、激活值、KV Cache、临时张量;区分训练/推理阶段,推理常见原因:上下文过长、batch 过大、KV Cache 管理不当;排查步骤:缩 batch、缩 context、关闭 profiling,逐步定位具体层;理解调度策略对显存峰值的影响


Q48: 介绍一下 vLLM 的 page attention 原理。

【核心解析】 将 KV Cache 切分为固定大小的 page 进行管理,类似操作系统分页;提高显存利用率,减少碎片,支持灵活调度和连续批处理;解决变长序列缓存管理问题,避免长短请求互相阻塞;提升在线推理的吞吐和资源利用率


Q49: 讲讲JVM垃圾回收机制,重点说对象什么时候进入老年代

【核心解析】 对象分配策略:优先在Eden区分配,大对象可能直接进入老年代;晋升条件:经过多次Minor GC仍存活,年龄达到阈值(默认15),或Survivor区空间不足;动态年龄判断:若Survivor中相同年龄对象大小总和超过Survivor空间一半,则年龄大于等于该年龄的对象直接晋升;老年代GC:Full GC触发条件,常见回收器(CMS、G1)的特点与停顿模型;线上问题:晋升过快导致老年代频繁GC,碎片化引发分配失败,需结合日志分析


Q50: 消息积压怎么排查?

【核心解析】 定位瓶颈:区分生产过快还是消费过慢,检查是否存在热点分区或key导致局部积压;消费耗时分析:拆解消费链路,判断耗时在数据库、RPC、锁、重试或序列化等环节;重试与死信:检查重试风暴、死信队列堆积,消费者线程池状态;实例分布:消费者实例数量、负载均衡情况;解决方案:扩消费者、优化消费逻辑、限流、降级、增加重试策略


Q51: 说一下MySQL索引最左前缀原则,什么情况下看起来用了联合索引,实际还是全表扫描

【核心解析】 最左前缀原则:联合索引的命中取决于查询条件是否从最左列开始且连续匹配;索引失效场景:中间列缺失、范围查询过早、函数或类型转换、排序不匹配;即使key命中也可能低效:优化器可能因回表成本高、选择性差而选择全表扫描;判断方法:通过EXPLAIN的rows、filtered、Extra字段分析实际执行计划;优化建议:合理设计索引列顺序,避免索引失效操作


Q52: MySQL里为什么B+树比红黑树更适合做索引?

【核心解析】 磁盘IO优化:B+树扇出大,树高更低,减少随机IO次数;范围查询高效:叶子节点形成有序链表,支持顺序扫描;数据存储:非叶子节点只存键值,叶子节点存完整数据,提高缓存命中率;红黑树局限:二叉结构导致树高较高,磁盘IO次数多,不适合大规模数据存储;B+树设计目标:针对磁盘块读取优化,一次IO加载多个键值


Q53: 在高并发系统里,Redis除了缓存还能做什么?

【核心解析】 分布式锁:使用SETNX实现,需注意锁超时、可重入、Redlock算法;限流与计数器:基于INCR实现固定窗口或滑动窗口限流;延迟队列:使用ZSET按时间戳排序,实现延迟任务;排行榜:ZSET的ZADD和ZRANGE实现实时排名;状态存储:会话管理、幂等控制、临时数据存储,尤其适合Agent系统中的任务中间状态


Q54: 如何设计缓存高可用方案,防止缓存失效导致数据库压力过大?

【核心解析】 缓存穿透:布隆过滤器、缓存空值;缓存击穿:互斥锁(synchronized+双重检查)、逻辑过期;缓存雪崩:过期时间随机化、多级缓存、限流降级;本地缓存兜底:结合Guava Cache或Caffeine,减少Redis压力;有序退化:确保缓存失效后系统仍能通过限流、降级、熔断保持稳定


Q55: redis 如何实现高可用高并发?

【核心解析】 高可用:主从复制、哨兵模式、集群模式;高并发:单线程模型、IO 多路复用、数据分片、管道技术;持久化策略(RDB/AOF)平衡性能与数据安全;分布式锁、缓存穿透/雪崩等问题的处理;结合实际场景说明配置与优化。


Q56: 如何实现零拷贝?

【核心解析】 零拷贝的概念与目的;常见实现方式(如sendfile、mmap、splice等);零拷贝在操作系统层面的原理;零拷贝在网络传输中的应用与性能优势


Q57: epoll中的LT和ET模式有什么区别?

【核心解析】 LT(水平触发)与ET(边缘触发)的工作机制;LT模式下事件通知的重复性;ET模式下必须非阻塞I/O的原因;两种模式的应用场景与性能差异


Q58: select和epoll的区别是什么?

【核心解析】 select和epoll的I/O多路复用机制;select的轮询方式与文件描述符限制;epoll的事件驱动与回调机制;epoll在高并发场景下的性能优势


Q59: MySQL的慢查询如何定位和优化?

【核心解析】 慢查询日志的开启与配置;使用EXPLAIN分析查询计划;常见优化手段(索引优化、SQL重写、表结构优化);慢查询阈值设置与监控


Q60: Redis有哪些常用命令?

【核心解析】 Redis的数据类型(String、Hash、List、Set、ZSet)及对应命令;键管理命令(DEL、EXPIRE、TTL等);事务与管道命令;发布订阅相关命令


Q61: 如果开发一个Agent,在WebSocket和另一种通信方式之间如何选择?

【核心解析】 理解WebSocket的特点(全双工、低延迟)及适用场景;对比其他通信方式(如HTTP轮询、SSE)的优缺点;能够根据Agent的实时性需求、资源消耗做出选择;考虑扩展性与兼容性


Q62: Redis 分布式锁的原理是什么?如何处理服务宕机导致的锁异常?

【核心解析】 基于 SETNX 和过期时间的加锁机制;锁续期(watchdog)防止业务未完成锁过期;Redlock 算法在集群中的实现;服务宕机时锁自动过期释放;更健壮的锁方案(如 Redisson、ZooKeeper)


Q63: 在红包系统中为什么选择 RocketMQ?它的顺序消息、普通消息、事务消息分别适合什么场景?为什么不能混用?

【核心解析】 RocketMQ 的高吞吐、低延迟、事务消息特性;普通消息适合最终一致场景(日志、通知);顺序消息适合按业务键严格顺序的场景(订单状态);事务消息适合本地事务与消息投递的原子性;三者消费模型、失败恢复和成本模型不同,不能混用


Q64: 在缓存设计中,如果Redis中没有数据,你会如何处理?会去查询数据库吗?

【核心解析】 缓存穿透的应对策略(如布隆过滤器、缓存空值);缓存击穿的解决方案(互斥锁、永不过期);缓存雪崩的预防(过期时间随机化、多级缓存);数据库查询的降级与限流


Q65: 如何保证Redis和数据库的数据一致性?

【核心解析】 Cache Aside Pattern(旁路缓存)的读写流程;延迟双删策略;基于binlog的异步更新(如Canal);分布式事务与最终一致性;强一致性与性能的权衡


Q66: 写入Redis的订单信息会设置过期时间吗?为什么?

【核心解析】 缓存过期时间的作用(防止内存溢出、数据时效性);订单信息的业务特性(可能需要持久化、状态变更);缓存与数据库的更新策略;淘汰策略与内存管理


Q67: 你提到引入了本地缓存、Redis和数据库,这三者之间的一致性如何保证?

【核心解析】 多级缓存的更新顺序与失效策略;本地缓存的同步机制(如广播、消息队列);数据变更时的最终一致性方案;缓存穿透与击穿的联合防护;监控与兜底策略


Q68: 为什么不能全部使用RocketMQ?Kafka和RocketMQ的主要区别是什么?

【核心解析】 Kafka的高吞吐量、持久化与分布式设计;RocketMQ的事务消息与顺序消息支持;适用场景差异(日志收集vs业务消息);运维复杂度与社区生态;技术选型的权衡因素


Q69: MySQL的InnoDB引擎为什么强制要求建表时必须有一个主键?

【核心解析】 InnoDB的索引组织表特性(数据按主键顺序存储);主键作为聚簇索引的唯一标识;若无显式主键,InnoDB会选择唯一非空索引或自动生成隐藏主键;主键对插入性能、空间碎片的影响


Q70: Redis是单线程还是多线程?

【核心解析】 Redis核心网络IO和命令执行是单线程的(基于Reactor模式);Redis 6.0引入多线程IO处理网络读写;单线程模型避免锁竞争和上下文切换开销;多线程仅用于特定场景(如异步删除、IO线程)


Q71: Redis+Lua怎么应对百万级的队列式并发限流

【核心解析】 利用Redis的单线程特性保证Lua脚本原子执行;Lua脚本实现令牌桶或滑动窗口限流逻辑;队列式限流的概念(如有序集合实现延迟队列);高并发下Redis的性能瓶颈与集群方案;如何保证限流算法的准确性和低延迟


Q72: Redis里的信息是怎么跟MySQL做同步的

【核心解析】 缓存旁路模式(Cache Aside)的读写流程;延迟双删策略保证一致性;基于binlog的异步同步(如Canal);消息队列实现最终一致性;同步失败的重试与补偿机制


Q73: 如果消费队列扣减失败或订单写入MySQL失败,导致数据不一致,你有什么自动化机制(校验+补偿)来解决

【核心解析】 分布式事务方案(如TCC、Saga);本地消息表+定时任务补偿;对账机制定期校验数据一致性;死信队列处理失败消息;幂等性设计防止重复消费


Q74: 对于智能客服Agent服务,在电商大促流量尖刺场景下如何解决高并发问题?

【核心解析】 弹性伸缩与自动扩容;缓存策略与热点数据预加载;限流降级与熔断机制;异步处理与消息队列;服务无状态化与负载均衡


Q75: SSE和WebSocket的区别是什么?

【核心解析】 SSE 是单向服务器推送,WebSocket 是全双工通信;SSE 基于 HTTP 协议,WebSocket 是独立协议;SSE 自动重连,WebSocket 需手动实现;SSE 仅支持文本数据,WebSocket 支持二进制;适用场景差异(实时通知 vs 实时交互)


Q76: Redisson分布式锁的过程、原理

【核心解析】 基于Redis的分布式锁实现原理;Redisson的看门狗机制自动续期;可重入锁的实现与锁标识;红锁算法解决主从切换问题;与SETNX+过期时间的简单锁对比


Q77: MySQL事务隔离级别、MVCC原理、流程

【核心解析】 四种事务隔离级别(读未提交、读已提交、可重复读、串行化)及解决的问题;MVCC通过undo log和ReadView实现多版本并发控制;ReadView的生成时机与可见性判断;可重复读级别下如何避免幻读(间隙锁与MVCC结合);MVCC在读写并发时的性能优势


Q78: MySQL的索引

【核心解析】 索引的数据结构(B+树、哈希等)及原理;聚簇索引与非聚簇索引的区别;索引的最左前缀原则与覆盖索引;索引的优缺点及创建原则;索引失效的常见场景


Q79: 了解语言特性吗?Java 的 JVM 和 Python 的协程讲讲看。

【核心解析】 JVM 内存模型、垃圾回收机制、类加载过程;Python 协程原理(async/await、事件循环);并发编程模型对比(线程 vs 协程);语言特性对 Agent 系统性能的影响。


Q80: 你的横向课题用的什么数据库?MySQL 了解吗?高并发场景下如何处理?

【核心解析】 MySQL 的存储引擎(InnoDB)、索引优化、事务隔离级别;高并发场景下的解决方案(连接池、读写分离、分库分表);数据库在 Agent 系统中的应用(存储记忆、日志);性能调优与监控。


Q81: vLLM 启动推理服务时常见的配置参数有哪些?

【核心解析】 模型路径、张量并行大小、流水线并行大小、显存利用率上限、最大模型长度、GPU 数量、量化方法等;需了解参数对资源分配和性能的影响;体现对推理引擎系统化配置的理解。


Q82: Redis缓存击穿、缓存穿透、缓存雪崩分别是什么?如何解决?

【核心解析】 缓存击穿:热点key过期,大量请求直接打到数据库,解决方案包括互斥锁、逻辑过期;缓存穿透:查询不存在的数据,请求穿透缓存直接访问数据库,解决方案包括布隆过滤器、缓存空对象;缓存雪崩:大量key同时过期或Redis宕机,导致数据库压力骤增,解决方案包括过期时间加随机值、高可用架构、限流降级。


Q83: Spring中事务管理的方式和原理?

【核心解析】 声明式事务(@Transactional)和编程式事务(TransactionTemplate);事务传播行为(如REQUIRED、REQUIRES_NEW);隔离级别与数据库锁机制;事务管理器(PlatformTransactionManager)的作用;AOP代理实现原理。


Q84: Redis分布式锁的实现方式?

【核心解析】 基于SETNX命令加锁,配合过期时间防止死锁;Redisson等客户端封装的看门狗机制自动续期;Redlock算法解决单点故障问题;锁释放时需验证持有者身份(Lua脚本原子操作);分布式锁的可靠性与性能权衡。


Q85: 创建一个线程池需要考虑哪些参数?

【核心解析】 核心线程数(corePoolSize)、最大线程数(maximumPoolSize);空闲线程存活时间(keepAliveTime)和时间单位;工作队列(BlockingQueue)类型和容量;线程工厂(ThreadFactory)自定义线程创建;拒绝策略(RejectedExecutionHandler)如AbortPolicy、CallerRunsPolicy。


Q86: 事务隔离级别有哪些?分别解决了什么问题?

【核心解析】 读未提交(Read Uncommitted):存在脏读、不可重复读、幻读;读已提交(Read Committed):解决脏读,存在不可重复读、幻读;可重复读(Repeatable Read):解决脏读、不可重复读,存在幻读(InnoDB通过间隙锁部分解决);串行化(Serializable):解决所有问题,但并发性能最低。


Q87: Java内存泄露问题及排查

【核心解析】 常见原因:长生命周期对象持有短生命周期对象引用;未关闭的资源(如连接、流);静态集合类无限增长;排查工具:jmap、jstack、MAT、VisualVM;分析堆转储文件定位泄漏对象与GC Root引用链。


Q88: vLLM 为什么可以加速推理?其原理、收益和代价是什么?

【核心解析】 vLLM 使用 PagedAttention 管理 KV 缓存,减少内存碎片,提高吞吐量;原理是通过分页机制动态分配显存,支持更大批处理;收益是显著提升推理速度,降低延迟;代价是实现复杂度高,需要额外显存管理开销。


Q89: 超出 128K token 的序列如何在合理内存下进行推理?

【核心解析】 使用分块注意力机制,如 Ring Attention 或 FlashAttention 分片处理;采用 KV 缓存压缩或量化技术减少显存占用;利用模型并行或流水线并行将序列分布到多卡;使用递归或记忆机制分段处理长序列。


Q90: 你的Redis+Lua脚本实现预扣减的具体逻辑是怎样的?数据最终是放在Redis吗?

【核心解析】 预扣减场景:如秒杀库存扣减,先扣Redis再异步同步DB;Lua脚本保证原子性:检查库存、扣减、记录预扣信息;Redis作为缓存,最终数据持久化到数据库;考虑并发竞争、超时回滚、数据一致性;解释Redis与DB的数据同步策略。


Q91: 你有了解过Redis的可靠性吗?

【核心解析】 Redis持久化机制(RDB/AOF);主从复制与哨兵模式;集群分片与数据一致性;故障恢复与数据丢失场景;缓存穿透/击穿/雪崩的应对


Q92: 如果让你重新设计这套系统,你会先拆哪几个边界,而不是先画微服务图?为什么先拆交易主链路和旁路能力?

【核心解析】 识别核心业务域与支撑域;主链路聚焦强约束动作(下单、库存冻结、支付确认、履约状态推进);旁路能力异步化(优惠、积分、营销、通知);边界划分原则:数据一致性要求、可用性要求、变更频率;避免过度同步阻塞,提升系统弹性


Q93: 为什么很多高并发系统最后会死在“局部强一致执念”上?

【核心解析】 同步阻塞导致资源耗尽;并非所有链路都需要强一致;核心事实(资金、库存、资格)先落稳,副作用异步扩散;最终一致性的接受与设计;局部强一致需克制,只放在关键约束位置


Q94: 如果消息队列突然从“稳定削峰”变成“放大故障”,你会优先怀疑什么?

【核心解析】 优先怀疑消费逻辑的副作用扩散,而非Broker本身;消费端下游依赖变慢或失败;重试机制缺乏退避;批量消费中混入慢消息;分区热点导致局部积压;消息模型未隔离高价值与低价值事件


Q95: 多仓、多渠道、多状态库存系统如何解决口径不一致问题?

【核心解析】 不能仅靠加锁处理,锁只能解决瞬时竞争,无法解决异步回流、消息延迟和状态对账;主库存收口,预占库存独立建模;异步回补加审计;定时对账清理脏数据;使用原子校验并扣减库存(如Redis Lua脚本)。


Q96: Kafka 除了高吞吐外,还有哪些优势?它适合什么场景?

【核心解析】 Kafka 适合日志型、事件型、可回放的流式场景;通过顺序追加写、分区并行、批量传输、页缓存和零拷贝实现高吞吐;天然支持消费位点、重放和多订阅者模型,类似分布式提交日志;适用于实时分析、事件总线、CDC、埋点流和异步解耦;但不适合复杂延迟消息、优先级和严格事务隔离的场景。


Q97: Kafka 为什么能做到高吞吐?线上瓶颈通常出现在哪里?

【核心解析】 高吞吐来自顺序写磁盘、批量发送与拉取、分区并行、操作系统页缓存、压缩和零拷贝,避免随机IO;瓶颈可能出现在Broker磁盘打满、分区倾斜、消费滞后、页缓存命中下降、网络带宽不足或副本同步延迟;性能优势依赖于访问模式和资源模型的匹配,需注意监控和调优。


Q98: 追踪订单状态变更链路时,如果发生数据丢失,如何定位?

【核心解析】 先确定丢失环节:未生产、未投递、未消费、消费失败未补偿或查询链路不可见;沿链路串联日志、traceId、消息key、数据库记录、消费位点和告警时间线;异步系统中需区分真实丢失与延迟或视图未更新;利用分布式追踪和监控工具定位具体失败点;最终一致性下需检查补偿逻辑是否正常执行。


Q99: Redis缓存击穿、穿透、雪崩的场景及解决方案是什么?

【核心解析】 缓存击穿:热点key过期,大量请求直达数据库,解决方案为互斥锁或永不过期;缓存穿透:查询不存在的数据,请求穿透缓存,解决方案为布隆过滤器或空值缓存;缓存雪崩:大量key同时过期或Redis宕机,解决方案为过期时间随机化、高可用架构、限流降级。


Q100: MySQL的存储引擎有哪些?它们的特点是什么?

【核心解析】 InnoDB支持事务、行级锁、外键,适合高并发OLTP;MyISAM不支持事务,表级锁,适合读多写少;Memory数据存储在内存,速度快但重启丢失;Archive适合归档,压缩比高,只支持插入和查询。