9. 安软信息技术研发外包面试复盘
结果:
挂了
时间
2023.3.9
心得
一直问我项目线上情况,和消息队列,感觉有点看不上我做过的项目
还问了死锁相关问题----八股没背,又一次心痛自己
问题
做过的比较久的项目是什么?
费用管理系统(需要针对这个项目包装一番,什么高并发大数据jvm调优都塞进去)
说一下你负责的一些东西
首先说一下背景,这个项目主要是围绕申请单和报销单去做了一系列开发,包括预提,冲销,预时对比,预算控制等会计人员的操作。
我主要负责的模块有智能审核模块和保险索赔模块。智能审核模块是基于页面维护的规则信息,对申请单和报销单中的对应字段进行审核校验,这个模块的核心方法是比较方法,是基于不同业务场景和不同比较类型去做比较,比如金额比较、日期比较、字符串比较等。基于此我采用了设计模式中的策略模式进行实现,以及简单工厂模式对它的上下文类进行封装。另外还用到了分布式锁去保证在多机器节点下对共享资源的排他性。
保险索赔模块是相对独立的一个小模块,是基于四种角色和五种单据类型进行的一系列审批流操作。
这个系统的并发用户能达到多少?
数据库连接线程池设置的200,盲猜200
说一下怎么用分布式锁做业务的?
回答分布式锁原理和用法
其他实现分布式锁的方式是什么?
数据库的字段形式,Zookeeper,然后讲一下各自实现原理
什么是死锁?
从三个方面回答
什么是死锁:
死锁是一组互相竞争资源的线程因互相等待导致“永久”阻塞的现象
发生死锁的原因 :
- 互斥条件,共享资源 X 和 Y 只能被一个线程占用
- 占有且等待,线程 T1 已经取得共享资源 X 在等待共享资源 Y 的时候 不释放共享资源 X
- 不可抢占,其他线程不能强行抢占 线程 T1 占有的资源
- 循环等待 , 线程 T1 等待线程 T2 占有的资源 , 线程 T2 等待线程 T1 占有的资源
如何避免死锁:
打破其中任意一个条件,即可避免死锁问题。
互斥条件无法被破坏;
针对 占用且等待, 可以一次性申请所有的资源 ;
针对 不可抢占, 占用部分资源的线程, 进一步申请其他资源时, 如果申请不到, 可以主动释放它占有的资源
针对 循环等待, 可以靠按序申请资源来进行预防,是指资源是有线性顺序的 申请的时候可以先申请资源序号小的,再申请资源序号大的,这样线性化后自然就不存在循环等待了
发生了死锁怎么解决?
排查:通过sql进行排查
show engine innodb status;
然后定位到相关代码并修改。
控制并发量的方案?
加锁,或者乐观锁,控制线程池大小,使用消息队列
有没有在公司项目搭建过redis?
无(这里要说有,flag:搭建主从redis集群)
redis淘汰策略有哪些?默认是什么?
有很多,先不记下来
默认:
volatile-lru:基于LRU算法淘汰最近最少被使用的那些key
jvm调优实操过吗?用的什么工具?
部署服务是你部署的吗?
不是....
怎么查询慢sql?
可以通过一些工具
sql怎么调优?
数据库分库分表有什么方案?
垂直,水平
授权码模式的大概原理是什么?
MQ怎么实现重试机制?
固定重试或者死信队列-----日后研究
RocketMQ的确认机制了解吗?
日后研究
一个服务部署多个节点,一个节点对应一个消费者,怎么保证同一时间内只消费一条消息,或者你说一下他的一些相关的配置。
幂等性设计,通过redis或者数据库唯一键