面试总结

orbisz2025/8/12面试
  • 项目描述。用通俗易懂且简洁的方式简述项目,阐述整个项目及其背景、规模,不要有太多的技术词汇。
  • 项目模块。2-3 分钟的流程介绍,详细的列出项目实现的功能,各个模块,整个过程,大概思路。
  • 项目技术栈。说出项目实现的技术栈和架构,能说出项目的不寻常之处,比如采用了某项新技术,采用了某个架框等,简要说明技术选型。
  • 候选人的角色及责任。说出你在项目中的责任,所涉及的功能模块,运用的技术,碰到的难题、代码细节,技术点、应对措施。
  • 项目总结,待优化点。

万能的 STAR 原则

  • Situation(背景):做这个项目的背景是什么,比如这是个人项目还是团队项目,为什么需要做这个 项目,你的角色是什么,等等。
  • Target(目标):该项目要达成的目标是什么?为了完成这个目标有哪些困难?
  • Action(行动):针对所要完成目标,你做了哪些工作?如何克服了其中一些困难?
  • Result(结果):项目最终结果如何?有哪些成就?有哪些不足之处可以改进?

针对面试时,面试官可能会问的项目问题以及哪些地方可能会深挖。

高并发扣减库存的幂等与一致性 → 因为涉及 Redis、分布式锁、异步回写、延迟队列,这是电商促销的核心问题。

动态 Agent 装配与任务编排 → 能看出你是否真正理解“组件化 + 运行时规则驱动”的价值,而不是只会写死逻辑。

MQ 消息补偿与幂等处理 → 在分布式场景下,消息重复、丢失、乱序的处理能力非常能看出工程功底。

RAG 知识库和多模型适配 → 涉及 AI 场景的工程化落地能力,而不仅仅是“会调 API”

幸运营销汇-积分抽奖服务

  1. 为什么使用DDD领域驱动设计,好处是什么
  2. 如何划分 “抽奖领域” 的实体、值对象和聚合根的?能否举例说明某个核心实体(如 “抽奖策略”)的属性设计及边界定义?
  3. 还知道哪些设计模式相关,你在抽奖服务中用了模板模式、责任链、组合模式,能否手写一个责任链模式的简化实现,并说明为什么不用策略模式?
  4. 领域模型是怎么设计的? 答:头脑风暴,罗列事件和行为,在根据实体来划分领域的。简单说也就是根据业务流程划分的。这个过程包括;活动域、抽奖域、积分域、兑换域。也就是用户通过某种行为记录,发放计算,兑换活动参与资格,完成抽奖获得奖品。
  5. 规则树是怎么存储和执行的?如何支持规则动态组合和热更新?如何处理规则变更时的热更新?
  6. 规则树的节点类型(如概率节点、奖品节点、兜底节点)是如何设计的?如何支持规则的动态修改(如运营后台调整概率)?
  7. 抽奖如何实现的,黑名单过滤,积分阶梯如何实现的,并发量太多怎么办
  8. 责任链的具体实现(如节点如何动态添加/删除?链的终止条件是什么?)
  9. 责任链动态编排校验节点时,如何避免链路过长影响性能?规则树动态组合如何支持新增规则(如地区限制)而无需改代码?
  10. 前中后流程如何设计的?如何用模板模式保证核心流程不变性?
  11. 库表如何设计
  12. 各个节点功能(人群过滤、积分校验等)如何实现?每个节点的执行顺序如何动态调整?
  13. Redis decr和setnx如何保证库存扣减安全,以及对应的操作如何实现。分段库存设计为什么要搭配分布式锁?“Redis 分段库存” 具体是如何设计的?如果 Redis 分段库存与数据库数据不一致,如何回补或修正?
  14. Redis DECR 原子性是如何保证的?为什么还能出现超卖?如果 Redis 宕机,库存扣减会出现什么问题?你如何保障高可用与数据一致性?
  15. 用setnx实现分布式锁时,锁的过期时间如何设置?如何避免 “锁过期后任务未完成” 导致的超卖?是否考虑过 Redisson 的红锁方案?为什么最终选择setnx?
  16. 异步队列+定时任务的实现,一致性相关:最终一致性和强一致性。为什么用异步队列+定时任务批量回写而不是直接扣减数据库库存?异步队列批量回写DB时主从延迟导致超卖如何处理?为什么不使用MQ?
  17. RabbitMQ相关知识,如何解耦发奖,异步调账与返利流程,RabbitMQ 在发奖与积分调账解耦时,如何处理消息幂等性?
    • 唯一索引约束 :在核心表(如 user_award_record )上建立 userId+orderId 唯一索引,防止重复处理
    • 订单ID作为幂等标识 :所有消息都携带 orderId ,消费时以此为依据判断是否已处理
  18. RabbitMQ 消息的生产端(如抽奖成功后发送消息)和消费端(如调账服务消费消息)是如何设计的?如何保证消息的可靠传输(如确认机制、死信队列)?消息积压时(如大促期间)如何处理?
    1. 消息的可靠性传输
      • 确认机制 :通过任务表记录消息发送状态,成功后更新状态
      • 补偿机制 : SendMessageTaskJob 定时任务扫描未发送成功的消息并重试
      • 幂等性保障 :如前所述,通过唯一索引和订单ID确保消息只被处理一次
      • 事务一致性 :核心业务操作(如保存中奖记录)在事务中执行,确保数据一致性
  19. Redis库存耗尽时推送MQ消息触发库存更新及延迟队列清理的实现,以及为什么要这么做。
  20. Redis 库存耗尽时,你为什么要清空延迟队列?答:
    • 当库存耗尽时,所有后续的库存扣减应该被拒绝
    • 延迟队列中可能存在尚未处理的库存更新任务,但此时库存已经为0
    • 清空队列可以避免这些任务执行后导致数据库库存出现负数 如果延迟队列里还有合法消息,会不会丢单?
    • 理论上会存在丢单风险,因为清空队列会丢弃合法的库存更新请求
    • 但从业务逻辑来看,当库存耗尽时,系统已经不再接受新的抽奖请求
    • 延迟队列中的任务通常是已经完成的扣减操作的记录,清空队列是为了避免重复更新
  21. “Redis 库存耗尽时推送 MQ 消息清理延迟队列” 的具体逻辑是什么?延迟队列中存放的是什么任务?如何避免用户在库存耗尽后仍发起抽奖请求(前端拦截还是后端校验)?
  22. MQ 消息堆积会怎么影响抽奖流程?如何解决?
    • 增加消费者实例,提高消费能力
    • 使用线程池并行处理消息(项目中已使用 ThreadPoolExecutor )
    • 优化消息处理逻辑,减少处理时间
    • 实现消息重试机制,避免处理失败导致的堆积
    • 考虑使用消息死信队列,处理无法消费的消息
  23. ElasticSearch相关,监控如何实现,Canal同步MySQL Binlog至ES的实现细节?如何处理大事务的Binlog同步(如批量插入抽奖记录)?ES的索引设计(如用户ID、抽奖时间、奖品类型)如何优化秒级数据分析?
  24. 压测相关知识,有没有进行压测,如何部署服务器,吞吐量和延迟是多少,如何继续优化
  25. 面试实际提问:https://wx.zsxq.com/group/48411118851818/topic/2855841145815841

Ai-Agent 智能体

  1. 你提到将 Advisor、Prompt、MCP 等能力模块化抽象,这些模块的核心接口是如何定义的?模块间的依赖关系是如何解耦的(比如用了什么设计模式)?
  2. 具体讲一下是怎么划分领域、子域和限界上下文 的?能举一个 Advisor / MCP / Prompt 在领域模型里的实体或聚合例子吗?
  3. 在动态构建 Agent 的过程中,如何保证 模块解耦 和 执行链路的可维护性?
  4. 领域模型如何与数据库设计映射?是否采用CQRS模式应对高并发读写?
  5. 请举例说明如何通过AOP实现Advisor的横切关注点(如日志、监控)注入?
  6. 工作流编排引擎的核心设计是什么?是否支持条件分支/并行节点?如何保证编排逻辑的原子性?
  7. 当用户组合不同的能力时,平台是如何保证执行顺序、依赖关系和容错的?
  8. 数据库中是如何设计表结构存储这些模块信息的?比如 “可配置” 具体体现在哪些字段上,如何通过数据库配置实现模块的动态组合?
  9. 这个项目中你划分了哪些核心领域?比如 “智能体构建”“工作流编排” 是否作为独立领域?每个领域的聚合根是什么?
  10. 领域事件是如何设计的?比如当一个 AI Agent 的配置变更时,会触发哪些领域事件,下游模块如何响应?
  11. 你是如何将 Advisor、MCP、Prompt、Model、API 这些执行组件存储在数据库里的?表结构大概是怎样的?细描述一下、数据表设计,包含哪些关键字段?
  12. 动态构建 Agent 时,如何从数据库配置映射到可执行的运行时对象?(比如你提到的 Spring 容器动态注入,底层怎么做?)
  13. 如果用户运行时频繁修改配置,如何保证 一致性和性能?
  14. 你是如何处理 多源解析(文档/Git/网页) 的?解析后数据清洗和向量化的流程是怎样的?
  15. 多源解析模块(文档 / Git 代码 / 网页)是如何处理不同格式的?比如解析 Git 代码时,如何提取函数、类等结构化信息?用了哪些工具或库(如代码解析用了 ANTLR 吗)?
  16. 如何将解析后的内容转化为向量存储到 PostgreSQL?向量维度是多少?生成向量时用了什么模型(如 BERT)?
  17. 当Git代码变更时,如何触发知识库增量更新?是否设计版本快照与差异对比算法?
  18. 如何保证解析结果与业务知识的一致性?是否引入人工审核流程?审核数据如何反馈到模型优化?
  19. 你如何做 知识更新和版本管理,避免知识库里出现陈旧数据?
  20. 在构建 RAG 系统时,最常遇到的问题是“检索不准”。你们遇到了哪些bad case?又是通过哪些策略(如:元数据过滤、重排序、HyDE、多向量检索等)来优化召回率和准确率的?
  21. RAG 知识库中,“检索” 和 “生成” 的具体流程是什么?比如用户提问后,如何从向量库中召回相关知识,又如何结合大模型生成回答?如何优化检索的准确性(比如遇到歧义问题时)?
  22. MCP 服务的核心功能是什么?你写到 MCP 平台支持 stdio/sse 协议,为什么选择 stdio/sse 协议?在 MCP 通信中分别扮演什么角色?能具体解释一下这两个协议在你们场景里的作用和区别吗?这两个协议在 CSDN 自动发帖、微信公众号通知场景中分别解决了什么问题(比如实时性、长连接稳定性)?
  23. 选择stdio/sse协议而非gRPC的考量?如何处理高并发下的连接稳定性?
  24. CSDN 发帖、微信公众号通知、ELK 日志分析、Prometheus 监控——这些场景是怎么通过 MCP 模块化抽象出来的?
  25. 以“CSDN 自动发帖”为例,请描述一次完整 MCP 调用的技术流程和数据流(从用户在平台上配置,到最终发帖成功)。其中涉及到的认证、安全、错误处理机制是如何设计的?
  26. MCP 执行过程中遇到失败(比如网络异常、外部 API 返回错误),平台是怎么处理重试、补偿或降级的?
  27. 调用 CSDN 或微信公众号的第三方 API 时,如何处理接口限流、失败重试?有没有做熔断或降级设计?
  28. CSDN自动发帖如何处理反爬机制?是否模拟用户行为(如随机点击间隔)?
  29. 公众号消息推送的QPS峰值如何应对?是否采用消息队列削峰?如何保证消息不丢失?
  30. 日志分析场景中,如何实现ELK链路的毫秒级延迟?是否采用异步批量写入优化?
  31. 监控告警场景的幂等性设计?如何防止重复通知导致业务系统过载?
  32. 你提到 一键 Agent 预热,能具体讲一下这个预热过程里做了什么?预热过程中如何监控资源占用(如线程池、连接池)?是否设计熔断降级机制?
  33. 动态注入 Spring 容器的实现方式是什么?用到了 BeanDefinitionRegistry 还是 ApplicationContext 动态刷新?如何解决依赖注入、Bean 生命周期管理以及线程安全等问题?
  34. 在多 Agent 并发运行时,如何保证注入的 Bean 之间不会互相干扰?
  35. 运营级配置服务如何实现 “实时调整、变更与上线”?配置存储在 Redis 还是数据库?配置变更时如何通知正在运行的 Agent 生效(比如推拉模式)?
  36. 你提到的 “问题分析 → 自主规划 → 精准执行 → 结果判定” 是如何实现的?能举一个完整闭环的例子吗?
  37. 在 “步骤级 Model • MCP + Prompt 配置” 中,平台是如何管理步骤之间的 上下文传递 的?
  38. Advisor 顾问角色访问知识库时,如何保证多轮对话里 上下文连续性和准确性?是否引入分布式锁或乐观锁?
  39. Advisor 角色如何访问知识库和上下文?上下文是存在内存还是数据库?如果对话过长导致上下文膨胀,如何处理(比如做摘要压缩)?
  40. 执行过程中如果某个步骤失败(比如 MCP 调用超时),系统会如何重试或降级?有没有设计失败的判定标准?
  41. 当同时有 1000 个用户构建定制化 AI Agent 时,系统的瓶颈可能在哪里?你做了哪些优化(比如缓存、异步处理)?
  42. 数据库和 Redis 在项目中分别承担了什么角色?有没有遇到过 Redis 缓存穿透 / 击穿的问题,如何解决?
  43. 这个平台听起来模块很多,你在落地时遇到的最大难点是什么?是架构抽象、数据库驱动、还是外部 API 集成?
  44. 当知识库文档数量极大时,向量检索可能成为瓶颈。你们是如何优化检索速度的?(预期:索引优化、量化、近似最近邻搜索等)。
  45. 是否考虑过向量数据库的冷热分层存储?如何优化历史数据查询性能?
  46. 整个 Agent 工作流是同步调用还是异步的?如何管理和监控长时间运行的任务?
  47. 如果让你现在扩展一个新的场景(比如 Jenkins 流水线自动化运维),你会如何把它接入现有的 MCP + Agent 平台?
  48. 如果你重新设计这个平台,会在哪些地方做改进(比如技术选型、架构设计)?
  49. 在服务编排层,是否评估过Kubernetes Operator方案替代传统Spring Cloud?
  50. 当Agent执行结果与预期不符时,如何快速定位是Prompt设计问题还是知识库缺陷?
  51. 如何设计日志链路追踪(如TraceID贯穿多服务调用)?是否结合ELK实现可视化分析?
  52. 如果要为金融行业定制Agent,需要在现有架构上增加哪些风控模块? 如何设计多Agent协作机制(如审批流场景)?是否引入区块链保证审计追踪?

动态注入 Spring 容器是通过什么方式实现的?比如用了 Spring 的 BeanDefinitionRegistryPostProcessor 吗?如何保证注入的 Agent 不会与容器中已有 Bean 冲突? 运营级配置服务如何实现 “实时调整、变更与上线”?配置存储在 Redis 还是数据库?配置变更时如何通知正在运行的 Agent 生效(比如推拉模式)? 通用对话分析模型与执行流程 问题分析、自主规划、精准执行、结果判定这四个步骤,每个步骤是如何落地的?比如 “自主规划” 如何将用户问题拆解为可执行的子任务(用了大模型的 Function Call 吗)? Advisor 角色如何访问知识库和上下文?上下文是存在内存还是数据库?如果对话过长导致上下文膨胀,如何处理(比如做摘要压缩)? 执行过程中如果某个步骤失败(比如 MCP 调用超时),系统会如何重试或降级?有没有设计失败的判定标准? 性能与稳定性 当同时有 1000 个用户构建定制化 AI Agent 时,系统的瓶颈可能在哪里?你做了哪些优化(比如缓存、异步处理)? 数据库和 Redis 在项目中分别承担了什么角色?有没有遇到过 Redis 缓存穿透 / 击穿的问题,如何解决? 项目难点与总结 这个项目中你觉得最难的技术点是什么?最终是如何解决的? 如果你重新设计这个平台,会在哪些地方做改进(比如技术选型、架构设计)?

拼团/大营销结合MCP可应用场景;

  1. 系统异常排查。开发一个mcp对接elk、普罗米修斯等,巡检系统日志,监控,数据库,分析异常根因
  2. 商品活动客服。开发一个mcp对接数据库、redis,检索仅能回答的配置类数据,用户通过客服了解奖品信息,抽奖优惠力度,适合自己的商品类型。

通用技术组件工程

  1. 为什么使用Redis作为注册中心而不是 Nacos/Consul/Zookeeper?
  2. 基于 SPI 机制的组件框架中,如何定义组件接口和实现类?业务系统如何 “按需引入” 组件(如只引入限流组件,不引入动态配置)?组件版本冲突如何解决?
  3. 自定义@DCCValue注解以及BeanPostProcessor 拦截机制的实现。BeanPostProcessor 的拦截时机是什么?你实现的 @DCCValue 注解热更新机制里,如何保证配置更新的原子性和可见性?
  4. Redis Pub/Sub 的推送在网络分区下会丢消息吗?如何保证一致性?Redis Pub/Sub消息丢失如何处理?
  5. 配置变更时(如动态调整限流阈值),如何保证业务逻辑的无缝切换?
  6. 如何解决的AOP注解识别问题
  7. 规则树组合模式是怎么序列化存储到数据库的?如果规则过多,如何避免执行性能下降?单例链和多例链的差别是什么?在多线程环境下如何保障线程安全?
  8. 标准化责任链(支持单例/多例链)与规则树(组合模式)的串行实现
  9. Guava RateLimiter 的令牌桶算法原理是什么?优缺点?为什么不用滑动窗口?,如何在分布式环境下实现全局 QPS 限流,可不可以通过Redis或者其他方式实现限流?
  10. 动态黑名单的失效策略(定时扫库 vs Redis过期)?
  11. 黑名单拦截的实现和降级回调,降级回调如何设计才能避免雪崩效应?
最近更新 2025/8/13 21:41:44