招银网络科技 java后端开发 二面 面经

1. 深入讲讲你项目中遇到的最复杂的技术问题,如何解决的?

参考答案:

我在做电商系统时,遇到过一个分布式事务的问题。场景是用户下单时,需要同时操作订单服务(创建订单)、库存服务(扣减库存)、积分服务(扣减积分)三个服务。如果其中一个服务失败,其他服务需要回滚,保证数据一致性。

最初我使用了两阶段提交(2PC)方案,但发现性能很差,而且存在单点故障问题。协调者挂掉后,所有参与者会一直阻塞等待。后来改用了Seata的AT模式,它是一种改进的2PC,通过拦截SQL自动生成回滚日志,性能和可用性都有提升。

但在高并发场景下,Seata的全局锁机制导致性能瓶颈。最终我采用了基于消息队列的最终一致性方案。下单时先创建订单,发送消息到MQ,库存服务和积分服务监听消息异步处理。如果处理失败,通过重试机制保证最终成功。对于无法重试的情况,记录到失败表,人工介入处理。

这个方案牺牲了强一致性,但换来了高性能和高可用。通过幂等性设计(使用订单号作为唯一标识)避免重复消费。通过消息持久化和确认机制保证消息不丢失。通过补偿机制处理异常情况。最终系统的TPS从200提升到2000,满足了业务需求。

这个问题让我深刻理解了分布式系统中CAP理论的权衡,以及不同一致性方案的适用场景。

2. 如果让你设计一个秒杀系统,你会如何设计?

答案:

秒杀系统的核心挑战是高并发和超卖问题。我会从以下几个方面设计:

前端优化方面,使用CDN加速静态资源,减少服务器压力。秒杀按钮置灰,只在活动开始前几秒才可点击,避免提前请求。使用验证码或滑块验证,防止机器刷单。前端限流,同一用户短时间内只能提交一次请求。

后端架构方面,使用Nginx做负载均衡和限流,超过阈值的请求直接返回"系统繁忙"。将秒杀服务独立部署,与正常业务隔离,避免相互影响。使用Redis缓存商品信息和库存,减少数据库压力。

库存扣减方面,将库存预加载到Redis中,使用Redis的原子操作(DECR)扣减库存。扣减成功后,异步创建订单并扣减数据库库存。使用Redis的Lua脚本保证库存检查和扣减的原子性,避免超卖。

订单处理方面,秒杀成功后先生成预订单,放入消息队列异步处理。订单服务从队列中消费消息,创建正式订单。如果创建失败,释放库存并通知用户。设置订单超时未支付自动取消,释放库存给其他用户。

防刷措施包括:同一用户同一商品只能秒杀一次,使用Redis记录。IP限流,同一IP短时间内请求次数限制。使用令牌桶算法限流,平滑处理突发流量。接入风控系统,识别异常行为。

监控和降级方面,实时监控系统QPS、响应时间、错误率等指标。设置熔断机制,服务异常时快速失败。准备降级方案,比如返回静态页面、关闭非核心功能等。

3. 讲讲MySQL的事务隔离级别,以及如何解决幻读问题?

答案:

MySQL的事务隔离级别从低到高分为四种:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)。

读未提交允许读取未提交的数据,会出现脏读问题。读已提交只能读取已提交的数据,解决了脏读,但会出现不可重复读问题(同一事务中多次读取同一数据,结果不一致)。可重复读保证同一事务中多次读取结果一致,解决了不可重复读,但会出现幻读问题(同一事务中多次查询,结果集不一致)。串行化强制事务串行执行,解决了所有问题,但性能最差。

MySQL的InnoDB引擎默认使用可重复读隔离级别。它通过MVCC(多版本并发控制)机制解决了大部分幻读问题。MVCC的原理是每行数据都有多个版本,每个版本有一个事务ID。读取数据时,根据事务的快照读取对应版本的数据,不会被其他事务的修改影响。

但MVCC只能解决快照读的幻读问题,对于当前读(SELECT ... FOR UPDATE、UPDATE、DELETE等)仍然会出现幻读。InnoDB通过Next-Key Lock(记录锁+间隙锁)解决当前读的幻读问题。间隙锁锁定记录之间的间隙,防止其他事务在间隙中插入数据。

在实际应用中,大多数场景使用默认的可重复读就够了。如果对一致性要求极高,可以使用串行化或者在SQL中加锁(FOR UPDATE)。如果对性能要求高,可以降低到读已提交,但要注意不可重复读问题。

4. Redis的持久化机制有哪些?各有什么优缺点?

答案:

Redis提供了RDB和AOF两种持久化机制,以及混合持久化方式。

RDB(Redis Database)是快照持久化,将某个时间点的所有数据保存到磁盘。触发方式有手动触发(SAVE、BGSAVE命令)和自动触发(配置save规则)。BGSAVE会fork一个子进程进行持久化,不阻塞主进程。RDB的优点是文件紧凑,恢复速度快,适合备份和灾难恢复。缺点是可能丢失最后一次快照之后的数据,fork子进程时如果数据量大会有短暂阻塞。

AOF(Append Only File)是追加日志持久化,记录每个写操作命令。有三种同步策略:always(每个命令都同步,最安全但性能差)、everysec(每秒同步一次,平衡性能和安全)、no(由操作系统决定,性能最好但可能丢失较多数据)。AOF的优点是数据更完整,最多丢失1秒数据。缺点是文件体积大,恢复速度慢。Redis会定期重写AOF文件,删除冗余命令,压缩文件大小。

混合持久化(Redis 4.0+)结合了RDB和AOF的优点。AOF重写时,将重写时刻之前的数据以RDB格式写入AOF文件,之后的增量数据以AOF格式追加。这样既保证了数据完整性,又提高了恢复速度。

在实际应用中,如果对数据安全性要求高,使用AOF的everysec策略。如果对性能要求高,可以只使用RDB或者关闭持久化。如果两者都要兼顾,使用混合持久化。还要注意定期备份RDB文件到其他机器,防止机器故障导致数据丢失。

5. 讲讲JVM的内存模型,以及如何排查内存泄漏问题?

答案:

JVM内存模型分为线程共享区和线程私有区。线程共享区包括堆(Heap)和方法区(Method Area)。堆是最大的内存区域,存储对象实例和数组,是垃圾回收的主要区域。方法区存储类信息、常量、静态变量、即时编译器编译后的代码等。线程私有区包括程序计数器、虚拟机栈、本地方法栈。虚拟机栈存储局部变量、操作数栈、方法出口等信息,每个方法对应一个栈帧。

内存泄漏是指对象不再使用但无法被垃圾回收,导致内存占用持续增长,最终导致OOM。常见原因包括:静态集合类持有对象引用,对象无法释放。监听器和回调没有注销,持有外部类引用。ThreadLocal使用后没有remove,线程池中的线程会一直持有。数据库连接、IO流等资源使用后没有关闭。

排查内存泄漏的方法是:首先通过监控工具(如Prometheus+Grafana)观察内存使用趋势,确认是否存在内存泄漏。使用jstat命令查看堆内存使用情况和GC情况,如果Full GC频繁但内存回收不下来,可能存在内存泄漏。使用jmap命令dump堆内存快照,在不同时间点dump多次,对比分析哪些对象在增长。使用MAT(Memory Analyzer Too

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试圣经 文章被收录于专栏

Java面试圣经,带你练透java圣经

全部评论
27届实习机会或看我住业 https://careers.pddglobalhr.com/campus/intern?t=4OmKPVeX9a
点赞 回复 分享
发布于 03-11 15:46 上海
好详细的面经 码住
点赞 回复 分享
发布于 02-27 15:05 四川

相关推荐

02-27 11:25
门头沟学院 Java
有面试过同岗的朋友欢迎评论区交流!1.若用户量大幅增长,实习的项目相关系统能否应对,瓶颈是什么?2.你平时会使用大模型处理哪些任务,觉得大模型在哪些任务上处理得好,哪些任务处理得不好?3.你做的另一个项目的核心目标和整体架构是什么?4.你做的另一个项目是生成文档还是生成核心代码?5.你做的另一个项目若工业界落地失败,会如何处理?6.你做的另一个项目在记忆模块设计上有什么思路,如何让相关技能更好地发挥作用?7.你做的另一个项目中,模型是如何选择的,有什么选择依据或方法?8.大模型幻觉问题该如何处理,服务化过程中会产生哪些相关问题?9.你做的另一个项目现在能否在本地运行?10.RAG的优缺点有哪些?11.多任务相关模型有什么适用场景?12.常见的Agent产品有哪些特质?13.若发现项目中模型执行不成功,会如何处理?14.长期记忆相关设计中,关键关注点有哪些?15.从整体设计角度,长期记忆相关功能会从哪些角度考量?16.长期记忆相关设计还有哪些可优化的点?17.Agent领域的发展趋势是什么?18.若代码生成成本越来越低,工程师的核心竞争力会发生什么变化?19.平时会通过哪些渠道关注AI技术动态?20.最近有没有遇到让你觉得印象深刻的AI应用,其情节或功能有较大亮点?21.进入项目后遇到新的工具技术,会如何评价技术是否能解决问题?
查看21道真题和解析
点赞 评论 收藏
分享
03-13 22:49
门头沟学院 Java
一面 1.syn 和 reen 区别2.reen 公平锁非公平怎么实现的3.对象调用被子类重写的方法 jvm 底层怎么实现的4.分布式锁5.websocket 底层怎么实现的6.websocket 和 http 长连接有啥区别7.dfs 深度过深造成栈溢出你怎么处理8.问实习9.打家劫舍 3二面面了一个半小时直接燃尽了1.自我介绍2.你觉得你实习做的亮点3.拷打实习4.主从模式下的 redis,此时主节点内容刚写,从节点还没来及同步 redis 宕机了,此时加的分布式锁还在吗5.主从 哨兵 cluster 的区别和优缺点6.redis 底层数据类型的组成和底层的扩容机制7.redis怎么查看 key的内存占用8.mysql 事务是怎么实现的9.mysql 突然宕机重启了数据会丢失吗?10.mysql 怎么选择索引11.底层怎么实现的12.http 请求报文里面有哪些内容13.http 长连接说一下14.长连接什么情况下会断开15.以前解决过的一个最难的技术问题16.实习中成长最大的一点17.实习过程中遇到的最大的挑战18.微信加好友这个功能怎么实现,需要定义那些接口,表怎么设计19.手撕,面试官自己出的一个题,题目本身不难,但是刚开始理解题目很困难,看懂题目花了 10 分钟。20.说一下你自己觉得学的最深入的一个技术是啥21.说一下自己的优点和觉得可以改进的一个点22.最近两三年觉得最有成就感的事情23.为什么从前司离职24.对以后的工作有什么想法三面1.对转语言有什么问题吗?2.转 go 的话你准备怎么学习呢?3.学习过程中遇到困难你会怎么解决?4.理解一些底层原理你会怎么做呢?5.实习遇到的最大的困难6.实习最大的收获7.实习中主动发现问题并且自己解决的例子8.对以后有什么计划,你做了什么来实现这个计划?9.自己在技术上面有哪些优缺点?10.对技术框架有执念吗?11.实习中压力最大的场景是什么12.怎么去理解程序员的责任心?你对自己有什么要求?13.项目时间紧你怎么处理呢?14.你除了后端开发还对那些感兴趣呢?15.有没有计划学习新技术呢?16.对 Agent 了解多少?17.喜欢游戏嘛?玩什么游戏?对做游戏感兴趣吗?下面换成hr继续问了18.是哪里人?19.上一段实习为什么离职20.找校招工作考虑那些因素21.最看重那几个说两三个22.有面到二三面的公司吗23.准备校招阶段一天花多少时间准备校招24.AiCoding 占比多少你自己做项目25.上一段实习有什么技术对你有帮助和收货吗26.这种技术你到下一家公司有什么复用的吗27.实习阶段从 mt 哪里学到了什么28.他对你的反馈如何29.三段实习中你最喜欢的是那段30.校招可以提前实习到毕业吗31.对微派有什么了解吗?32.平时学习了解方面都是那些东西33.你为什么不考研反问最后排序挂了没辙。
点赞 评论 收藏
分享
头像 会员标识
03-16 18:50
已编辑
广东工业大学 Java
🖊笔试部分1. 分别给出重载和重写的例子,然后说明他们的区别2. 异常为什么要传递异常信息,怎么捕获3. 字符串a,b,c...变成a->b->c4. List<Integer>怎么去重5. 状态机状态流转思路(随便写了if else)6. Post请求参数的方式有哪些7. Autowired多bean注入问题的解决方案(至少两个)8. 多线程并行处理任务:同时处理4个任务,每个任务下面还有3个子任务,如何高效处理(没写出来)📕面试部分1. 先自我介绍2. 写一个Switch,用String类型做判断,一到两个分支就好(写出来了,但是新旧版本写混了,把 ':' 和‘->’也给同时写出来了😂;还有我还写了 非空判断 的句子,他说java17后不用这么写了?)3. Mysql查询user表和phone表,查询出手机号大于2个的用户 (写的也不怎么好,还问我为什么要用join,有什么优势)4. 问了我笔试的第8道题,因为我没写出来5. 然后还问了我线程池提交任务后返回值是什么6. 提问环节😃总结这是我的第一次面试,我个人感觉应该是挂了,面试问我这几个问题我都答不出来,连项目都没问我😂。整个面试流程得一个小时左右,进去做完笔试后还等了一会儿才去面试。面试官人还挺好的,程序员格子衫形象,还亲自指出我现在的问题,受益匪浅,我真的很感动。
查看5道真题和解析
点赞 评论 收藏
分享
评论
5
23
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务