面经-1
更新: 7/3/2025 字数: 0 字 时长: 0 分钟
base:杭州
规模:中小厂
整体没有考察八股文,重要考察点在项目的真实性和面试者只身的业务能力
自我介绍一下
完全背诵
我看你是大二,能说一下为什么选择这时候来上班吗
A:我很早就有在了解目前的行业现状,由于我的自身学历不容乐观,根据目前的行业现状我只能选择在实习方面让自己更加有竞争力
你有参加过什么比赛吗
画外音:这里面试官特别的表现出了他想要的是学科竞赛相关的内容,实际并不了解/关心算法竞赛,由此得出他想要的是应试者是否具有一定的团队协作能力
我看你使用了很多的技术栈,这些技术栈你是如何选择的,还是就是靠网上教程推荐
这里根据后面跟面试官的反问,发现这个公司还有一部分的工作是要去调查一个项目的技术可行性,这里应该就是在看这个方面
A:啊,有的项目是依赖惯性,比如MySQL是因为我个人比较熟悉,而Redis作为缓存则是业内的成熟方案。而又的方案是我根据调研选择的,比如使用Cassandra作为拓展,这里是因为我考虑到了MySQL长文本的不足,然后我也选择了其他数据库进行对比,我的备选方案是Redis和Mogo,但是Redis基于内存,显然不现实,而Mogo不支持事务,这也是无法接受的。
Q:等一下,我看你的项目中有使用ES,那为什么不直接使用ES而是使用Cassandra,毕竟我们知道这里使用ES也能完成你高效存储的需求
这里回答不上来了,只是说我对ES的想法只停留在搜索,而这里最开始我就希望引入一个KV数据库解决这个问题。
一个结合AI的回答:
A:ES的优势在于倒排索引,虽然他也可以存储长文本,但是这不是他设计的初衷,这也就导致了你将长文本传入ES的过程中需要额外的支付一个搜索的开销和复杂性,而我这里只需要根据Id来锁定长文本就可以,而且我希望我的整个项目分工明确,ES只是承担他原本被设计的时候应该承担的职责。
我看你有使用一个分布式的Id框架,然后进行了压测,那你对整个项目有进行过压测吗
这里回答的不是很好,只是说了仅对一部分接口做了压测,得到了较好的结果,然后面试官立刻反问是否有具体数据,这下直接寄了。
给出一个通过AI总结的回答。
A:我这边的话针对一些核心的业务进行了压测,主要是Id的生成,因为他要被频繁的使用,经过我的实际测试,在每秒五万次的高并发下,99.9%的相应都在1ms以下,还有热点查询功能,我会发现通过三级缓存的效果可以把数据库的查询压力降到60%以下。ES的模糊搜索速度比直接数据库查询提高95%
拓展问题:这些数据是如何得到的
A:(见下)
Id:我会通过Jmeter开启一个线程组然后配置足够多的并发用户,同时设置一个较短的启动时间,模拟瞬时的高并发,当压测启动后,我会查看JMeter的聚合报告,这里会直接给出QPS
缓存:我会先清空缓存,然后注解掉代码中的缓存部分,进而完成对MySQL的压测,然后我会恢复缓存,同时通过提前让数据进入到缓存中再进行压测,然后关注数据库的整体情况,二者进行对比获取缓存效果
我看你项目中通过Rocket进行了一个异步的消息发送,同时进行了SpringRetry兜底,那你对于用户来说是如何保证消息一定成功的
这里实际上是我没有想到的,于是只能开编,以下是原本的情况
Q:为什么你会使用MQ异步
A:因为这个插入过程可能较慢,我不希望用户等待这个时间
Q:那你如何保证消息一定发送成功呢?
A:首先的话是MQ,他自己有一个重试机制,这就已经一定程度上兜底了,然后就是我又引入SpringRetry框架,这样能进一步兜底,我认为这是可以接受的。
Q:那么无论怎么兜底都会失败不是吗,你如何保证消息的成功呢?
A:我在代码实现中其实并没有立刻返回成功,这一块的话我的项目只是立刻返回了一个200,但是前端用户可以看到的是一个”帖子正在发送的“友好提示,如果实在失败的话我会使用MQ自带的回调去通知用户。
Q:那么用户是如何获取这个消息的呢?
A:我会在前端那里为用户提供一个查看帖子发送情况的共功能,那里能自动拉取查看发送失败的帖子。
一个结合AI的可能较好的回答版本
A:嗯,多层兜底确实可能没用,但是我认为使用MQ的ACK机制进行多次重试和Spring Retry的兜底已经是很完善的方案了,我们可以保证的是在正常情况下大多数的请求通过这一套机制都是没有问题的。
如果实在有问题的话,我这边首先是前端,虽然返回给用户的是200的响应码,但是前端其实显示的是”帖子正在发送,请一段时间后检查帖子状况“,这样就及时的提示了用户这个消息可能存在发帖失败的情况,然后如果真的失败的话,我会使用一个回调,然后将这个消息及时的通知给用户,让用户知道自己的帖子发送失败了
Q:你能详细的说说回调这一块吗
A:好的,我的回调使用的是一种站内信的形式,当帖子发送失败的时候,我会及时的将失败的讯息发送到一个专门的表中,然后再通过SSE的形式通知用户存在帖子有问题。
我看你自己部署了一套CI/CD流程,请问这是你自己部署的吗,整个流程能讲一下吗
这里提前准备了,赌赢了
A:我的CI/CD系统是使用的Gitea+Jenkins+Harbor+Docker+Docekr File的形式。然后首先是我会在本地编写一个Docker File用于构建,然后本地通过Git上传到Gitea上面,然后Jenkins自动的链接Gitea的webhook来自动的根据每次更新拉取数据,然后获得里面的DockerFile,再通过DockerFile来构建镜像并上传到Harbor上,最后Jenkins再自动的链接Docker从Harbor上拉取镜像部署
你的Docker使用的基础镜像是什么
这里回答的是Debian,然后直接炸裂了
面试官及时的提示我只引入JDK,MySQL,这里给出更好的回答。
A:由于为了镜像的精简性,我只引入了JDK作为基础镜像,然后项目的整体启动是通过Jenkins拉取Gitea中我编写好DockerCompose进行运行
好的,让我们来看看你的第二个项目,你说你的第二个项目使用了SpringAi,能说一下你对这个框架的认知吗
A:好的,SpringAI是Spring旗下的一个开源框架,这个框架主要是通过集成了多个LLM服务商的API来进行一个整合,同时还提供了一系列的附带功能,包括RAG,Agent(也就是Tool)的开发,并且由于其是Spring团队开发,所以对SpringBoot有着极好的适配性。值得一提的是,这个框架实际上是LLM开发框架,也就是在LLM的基础上进行拓展和在开发,而不是开发LLM的框架,我认为这是我们后端人员也必须注意到的。
(这里的回答得到了面试官的认可)
你了解SpringAI官方推荐的工作流吗
这个确实不了解,我问了是Agent-Rag那一套吗,面试官说不只是。
这里我就发现有点不对,因为我基本上看了一遍SpringAI的文档,也确实没有留意到这个东西,后面我去查了SpringAI的文档,确实有类似的东西,但是在很后面的一个地方,而Spring AI Alibaba则是将这个东西放在了一个很明显的地方。这里结合后面的另一个问题让我大胆猜测可能面试官他实际调查的是SpringAiAlibaba而不是Spring官方的那个SpringAI
SpringAIAilbaba中的工作流,文档点击进入就能直接看到
A:当然,SpringAI支持并推荐使用工作流模式,也就是所谓的Agentic System,旨在能够让LLM执行更佳复杂的任务链(Genmini的DeepReseacher),他提供了一种较好的LLM的实践方案与系统开发中如何使用多个LLM进行配合。
这里是让LLM自主的去动态规划自身的流程与工具的使用,这样可以给用户提供一个更好的体验感。
常见的工作流有:
- Chain Workflow:链式,LLM按照一个固定的顺序去执行一系列的操作
- Parallelization Workflow:并行,多个LLM或工具调用同时执行,进而加速处理速度
- Routing Workflow:路由:LLM动态的根据预设与输入选择(路由到)合适的处理萝莉
- Orchestrator-Workers:协调:通过一个主LLM负责规划和协调任务,并将子任务分派给不同的工作 LLM 或工具
你使用的基座大模型是哪个?
A:Deepseek
这里发生了一个小插曲,面试官视乎没有预料到这个回答,然后向我发出反问——Q:那你在使用Deepseek调用Tool的时候难道没有出现问题吗?
这也就是我上面说的另一个让我认为面试官调研的是SpringAiAlibaba的原因,因为在之前我有看到过SpringAIAlibaba里有这样一个Issue:# Deepseek 无法调用工具?
我本人其实是没有使用过SpringAiAlibaba的,所以不清楚这个Issue是框架真的有问题还是用户使用有问题,但是我个人在使用SpringAi调用Tool的时候是没有遇到过这个问题的。
A:这确实是个问题,因为我曾经看到SpringAiAlibaba中有这样的Issue,提到Deepseek无法正常使用Tool,但是我个人在使用SpringAi的时候没有出现过这个情况
(小插曲,这里我好像隐约听到面试官笑了以下)
那你用过其他的基座模型吗?
A:OpenAi的gpt
你本地部署过大模型吗?
A:使用Ollama部署过
你了解过MCP吗,你怎么看待MCP
A:了解过,我个人认为MCP是一种将部分开发交给服务提供商的方式,比如我们想要调用某个服务商的Api获取数据然后进行一定的处理再交给大模型,这一过程原本应该需要我们自己去写代码将他在他写入在我们的项目中,但是通过MCP协议,我们可以根据MCP的协议来规范他,进而让这个服务由服务提供商进行提供,我们只需要引入他的MCP就可以直接在不需要额外处理的情况下交给LLM,然后让LLM使用这些数据,这对于后端开发是极好的,而且还可以简化不必要的重复的代码。
这里也是过了,但是或许有更好的回答
A:我了解MCP。在我看来,MCP可以理解为模型中心化编程——Model-Centric Programming的一种实践,它旨在简化将外部服务或数据集成到大型语言模型(LLM)应用中的过程。
如果我们想调用某个服务商的API获取数据,进行预处理后再喂给大模型,传统方式下,我们需要自己编写大量的胶水代码来完成数据获取、格式转换以及与LLM的集成。而通过MCP,服务提供商会遵循一套预定义的协议或规范,将他们的服务封装成一个可供LLM直接或间接调用的模块。这意味着我们无需深入了解其API细节或数据处理逻辑,只需引入他们的MCP封装,LLM就能更无缝地获取和利用这些外部数据。
后面就是一些轻松的问题了
我看了你使用的技术栈,多且新,但是我们实际开发中实际上使用不到这么多的技术的,实际上大多数业务都是CRUD,你能接受吗?
我可太能了
由于你现在还在上学,你是打算实习一个暑假还是长久的实习呢?
我准备实习两到三个月,然后公司如果支持远程办公的话我也可以继续干。
那你能接收远程半薪吗
我可太支持了
有什么要反问的吗
咱这是怎么个工作流程,怎么带领新人,如果我进去主要干什么。