大家好呀,我是技术派的导演二哥呀。
之前有球友反馈自己的项目经历太少,不好写简历,影响找工作,不知道你有没有这样的困惑?
如果有,那这篇文章将完美解决你的痛点。
一共三大块。
第一块,技术派在面试中都会遇到哪些问题,并且该如何回答,有完美的模板套路。
第二块,校招生在写简历的时候,应该怎么写,可以直接抄,但尽量自己稍微动动脑子优化一下。
第三块,社招党在把技术派写到简历的时候,应该怎么写,有哪些考察的点需要注意。
如果你还没有加入二哥的编程星球,那么可以扫下面这个优惠券加入,不贵,但真的能帮你拿到心仪的 offer。
扫码加入知识星球即可解锁。
补充一些 25 届同学的 offer 截图,这些都是星球里的球友,他们的成功经历也是星球的成功(我骄傲了吗?嗯,骄傲了🤣)。
华为和京东、快手、百度、华为:
滴滴和百度、字节sp、美团、腾讯和京东、蚂蚁金服:
携程和饿了么、男朋友华为小米,自己京东:
太多太多,我就不一一列了。
记住一点,早就是优势,大家可以看一下这位球友的心路历程,是真的后悔没有早一点入,享受更多的优惠和更早的服务。
好,我们来进入重点。
1.1 核心面试点
考点 0:项目介绍
技术派是一个基于 Spring Boot、MyBatis-Plus、MySQL、Redis、ElasticSearch、MongoDB、Docker、RabbitMQ 等技术栈实现的社区系统。
这个系统旨在为创作者提供一个可以发布文章和教程,并赚取佣金的社区平台,同时又兼顾一些社交属性,比如说用户可以通过阅读、点赞、收藏、评论的形式和作者互动。
与此同时,为了紧跟时代潮流,该系统还为用户提供了一套基于 OpenAI、讯飞星火等多家大模型的派聪明 AI 助手,帮助用户在工作和学习中大幅提效。
项目立意说一下,是否上线,上线考虑过用户数吗?
由于平常热爱技术分享,于是就萌生一个大胆的想法,做一个比 CSDN、掘金、知乎更厉害的内容社区,起名叫技术派。
技术派里面用到的都是互联网当下最流行的技术架构,骨架是通过 Spring Boot+Mybatis-Plus 搭建的,并且是前后端分离的,admin 端用的是 React + TypeScript,其中还用到了数据库 MySQL、缓存中间件 Redis、搜索引擎 ElasticSearch、nosql 数据库 MongoDB、容器化技术 Docker、消息中间件 RabbitMQ、权限安全框架 SpringSecurity、日志框架 Logback、 接口文档 Knife4j、及时消息通信 WebSocket 等技术栈,并且对接了当前最火热的 AI 大模型 OpenAI 和讯飞星火 API,项目支持一键启动和部署,这个过程让我的技术得到了极大的提升。
最近还对接了微信支付和支付宝支付,以及文章付费阅读的功能,感觉有一个属于自己的实战项目可以不断地迭代,锤炼自己的技术,这个过程还是蛮有意思的。
我们的技术派已经上线,域名是 paicoding.com,你也可以参考其他球友的,比如说编程汇。
目前注册用户大概有 6000 多个,PV 每天有 5000 左右。
在项目中主要负责什么?
技术派是和三个宿友做的,我主要负责后端的接口开发,一名宿友负责前端,还有一名宿友负责 admin 端。
技术派是一个前后端分离的单体项目(主要用到的技术栈看上一个问题),本来二期是想做微服务改造的,后来我就想,不如直接再做一个新的业务吧,项目管理、OA 审批属于很多公司都会商用的项目,于是就又一起做了这个 PmHub,同样是我们三个人,我还是负责项目搭建、后端接口开发。
PmHub 是一个微服务项目,主要用到了 Spring Cloud、Nacos、Gateway、Seata、Sentinel 等技术栈。
具体开发的功能有哪些?
1、整体前后端分离骨架的搭建,后端用的 Spring Boot+MyBatis-Plus+Redis+RabbitMQ,Admin 管理端用的 React,用户端用的 Thymeleaf。
2、使用 JWT + Session + Filter + AOP 完成用户登录和权限校验,支持微信扫码登录
3、作者使用 Markdown 发布教程、文章,图片会自动上传至 OSS 并使用 CDN 分发,用户可以点赞、收藏、评论,并且使用 RabbitMQ 进行异步消息处理
4、对接deepseek、讯飞星火、智谱 AI、字节豆包、阿里通义、OpenAI 等多家大模型,完成派聪明 AI 助手功能的开发,使用了策略模式和工厂模式,新增模型时非常简单,并通过 WebSocket 和 Stream 流实现及时通信和消息一点一点输出的效果
5、使用 Redis 实现作者白名单和用户活跃榜单,并且对热点数据进行缓存,为了提高缓存效率减轻 Redis 压力,还增加了本地缓存 Caffeine 作为二级缓存
6、借助 xxl-job 实现文章定时发布,ES 实现快速高效的文章查询等等。
遇到过最深刻的问题,怎么解决的?
遇到最深刻的一个问题是,如何解决高并发情况下,大量用户同时访问同一篇热点文章,在缓存未命中的情况下,大量请求会同时访问数据库,对 DB 造成极大的请求压力,很容易将我们的 MySQL 打宕机,进而影响整个服务,这个时候该怎么办?
一开始尝试通过 Redis 的 setIfAbsent(key,value,time)
手动释放锁,但遇到了锁不能及时释放的问题、误释放别人的锁,以及过期时间的设置是否合理等问题。
最后还是通过引入 Redission 的看门狗算法进行解决,这样就可以一劳永逸了,不过手动尝试的方式的确也让我对看门狗算法有了一个更深入更直接的了解,它的内部实现也是按照我之前手动的逻辑实现的,起一个定时任务,每 10 秒检查一下锁是否释放,如果没有释放就延长至 30 秒。
项目中有哪些难点,如何解决?
在技术派这个项目当中,遇到了蛮多有挑战的任务。
比如说 MySQL 的库表自动初始化,用户在启动项目前不需要手动导入 SQL 文件,只需要在 application.yml 中配置好 MySQL 的用户名和密码,run 以下 main 类,就自动完成了。这个是通过 Liquibase 实现的。
再比如说技术派是一个前后端分离项目,admin 端请求后端 API 接口时会遇到跨域问题,这个可以通过 Node 代理或者 Nginx 设置同源策略解决。
再比如说用户点赞、收藏文章的时候,可以通过 RabbitMQ 的发布/订阅模式来提高异步效率,保证用户的操作能够得到及时反馈。
再比如说为了满足社区在高并发场景下业务 ID 的唯一性和可追溯性,我们实现了一套基于雪花算法(Snowflake)的 ID 生成方案,进一步降低了 ID 生成的延迟。
还有我们通过 Redis 实现了计数统计和用户活跃度排行,并通过先写 MySQL,再删除 Redis 的方案来保证高并发场景下的缓存一致性。
还有在对接讯飞星火、OpenAI 等大模型平台的时候,为了提高代码的复用性和可扩展性,我们采用了策略模式+抽象工厂的模式来实现。
考点1:微信公众号自动登录
用户在前端点击登录时,会展示公众号二维码和待输入的验证码,并会和前端构建一个半长连接,同时保存验证码和半长连接之间的映射关系。
当用户向公众号发送验证码时,微信公众平台会将用户发送信息转发给技术派的服务器,然后通过验证码来识别请求登录的用户身份。
由于验证码保存了和半长链接的映射关系,所以可以找到该半长连接,实现用户的自动登录跳转。
那如何保证验证码的唯一性、唯一设备、唯一用户识别,以及刷新验证码时,如何将之前的验证码置为失效呢?
登录后,如何通过 Cookie 和 Seesion 机制实现登录鉴权呢?
由于内容较多,这块详见技术派教程。
请说说微信扫码登录?
用户在 PC 网页端登录时,生成一个唯一的二维码,绑定请求端的身份信息,网页客户端和服务端保持链接,等待手机端扫描二维码获取授权 URL,微信端扫码登录成功后回调服务端接口(附带用户身份信息),并传回给应用服务器,完成登录。登录成功后,服务器生成一个 JWT 或 Session 并返回给 PC 端,用户完成登录。
考点2:通过 RabbitMQ 实现消息异步解耦
首先说一下,为什么要异步解耦?
当用户订阅、点赞、评论时,就会触发消息通知,如果当用户操作时,消息同步发送,当消息出现异常时,会影响主流程,或者当消息过多时,也会有影响服务的性能,所以需要对消息进行异步解耦。
选择 RabbitMQ 的原因是什么呢?
首先是社区活跃度高,然后 RabbitMQ 还提供了有一个易用的用户界面,可以让用户监控和管理消息,同时我们的系统对并发要求没有那么高,消息通知也可以无序,且 RabbitMQ 也支持消息路由,宕机后的消息也能自动恢复,所以就选择了 RabbitMQ。
由于是应届生,所以面试官一般不会考察消息队列的选型,万一考了,可以看看后面“工作 0-3 年”的回复。
RabbitMQ 连接池用的什么阻塞队列?为什么?队列大小?怎么确定这个大小是合适的?
使用的是 LinkedBlockingQueue,它是一个基于链表的阻塞队列。
LinkedBlockingQueue 的优点是锁分离,很适合生产和消费频率差不多的场景,这样生产和消费互不干涉的执行,能达到不错的效率。
队列大小生产环境是 10 个,因为我们是小型系统,通常设置在 10-50 个足够用了。可以通过监控队列的使用率、请求等待时间,和 RabbitMQ 的负载来动态调整,比如说 pool.size() / poolSize
如果经常接近 100%,说明连接池偏小;如果请求经常阻塞等待连接,说明连接池偏小;如果 RabbitMQ 负载过高,说明连接池偏大。
考点3:MySQL + Redis 相关知识点
问题 1:如何提高系统并发呢?
其实主要是在 MySQL 上游加一层 Redis 缓存,因为 Redis 支持集群、分片,单机就可以支持上万 QPS,所以可以大大提高系统性能。
实现方式主要是将热点数据放入 Redis 缓存,比如文中的分类和标签,使用频率会非常高,因为这些数据不会经常变动,且后台配置完毕后,会实时存入缓存中,非常适合作为热点缓存,并对热点缓存设置失效时间,比如 30 分钟,可以作为 R
5 条评论
回复