后端开发面经总结

阿里巴巴

2023/4/11 阿里后端一面

Q:开始问了我成品油源平衡系统的开发相关问题,提的问题是常规套路:

  • 介绍一下项目
  • 有哪些常规的定时任务方案选型
  • 原本项目是单机的,如果部署到多机下,如何解决多个定时任务的冲突

A:在介绍项目的时候我忽略了项目背景,项目模块以及项目技术栈的介绍,直接跳到了个人负责的功能介绍上,下次必须注意。常规的定时任务我只回答上了Timer和Spring Task,忽视了分布式定时任务(如Elastic-Job以及XXL-JOB,这些分布式定时任务总体来说就是通过集群实现调度器,来保障高可用)

接上面聊到的集群实现调度器,事实上这也是第二个问题的关键点,即集群实现调度器时,如何保障一致性?

我的回答是,一次仅生效一台调度器,其他调度器则是采用延迟自旋以及读取Redis字段的方式判断主调度器的存活情况,当存活失效时,通过单例生成方式来重新生成定时任务。(扩展:可考虑故障恢复策略的进一步设计)

Q:然后又问了我AQS以及ReentrantLock,其中有关于Condition的知识我没回答上来
A:Condition将各个线程分配成不同的group,使用Condition的signalAll方法只会唤醒注册在当前Condition上的线程

Q:又问了我一个迷惑问题,Redis中的hash结构和jdk的hashmap有啥区别?
A:最大的区别是,Redis的hash在entry数较少或元素大小较小的时候,采用ziplist作为hashtable以节省空间(ziplist就是将linkedlist的指针寻址改成紧邻偏移地址)

PS1:ArrayList可以插入null,是ArrayDeque不能插入null

2023/4/18 阿里后端二面

面试官水准很高,深挖了我在点单小程序开发中,支付接口幂等解决方案相关的内容

Q:不采用Redis的SETNX加锁方式,还有哪些接口幂等解决方法?
A:

  1. 使用ConcurrentSet,以用户ID+订单编号存入ConcurrentSet,且ConcurrentSet放置在JVM内存中,既解决幂等,也保证高并发的操作安全性
  2. 使用Zookeeper,由于ZK节点的高并发安全性,其解决幂等也是类似于Redis加锁的思路(创建单例节点)

美团

2023/4/13 美团后端一面

今天美团一面面试官没有深挖我的项目中的问题,提的Java相关的知识也是很常规的,但是还是有两个内容我回答的不好

Q: 解释一下Java内存区域?
A:我没有按照线程共享/线程私有/本地内存这样的分法做介绍,而是直接按照堆/栈/方法区进行的说明

Q:Java垃圾回收有哪几种标记方法,各自优缺点?
A:两种标记方法分别是计数器以及可达性分析,但是在回答优缺点时,我没有抓住重点:计数器的最大缺点是其无法处理相互引用的对象的垃圾回收

2023/4/18 美团后端二面

首先深入聊了一下项目,两个项目都存在很大的优化空间:

Q:炸鸡汉堡项目为什么要按照用户端和管理端进行区分?你知道企业级实现吗?
A:用户端和管理端的区分是一种逻辑上的区分,其存在重复功能点且通过数据库进行两端的交互不提倡;企业级实现中,不应按照用户端和管理端作区分,而应按照模块进行区分,如分为内容服务、支付服务、系统服务等等,并分别部署在不同的服务器中

Q:成品油源平衡系统计划录入模块表结构是怎样的?
A:分为生产信息计划表和消费信息计划表,两者的区别点主要在于时间规划上,生产信息计划表必须按天提交,消费信息计划表则可以给出一个可接受区间

Q:在实现trigger类时,为什么会考虑到引入canal中间件,增加的维护成本是否能抵消其带来的好处?
A:项目面临的是一个比较固定的数据库以及一个随业务需求和公司发展需要不断更新的代码逻辑,因此引入一个中间件直接对数据库进行读取,虽然带来了额外的维护成本,但其节省的修改成本是更明显的

然后问了Maven相关,两个问题我都没怎么答上来:

Q:Maven的scope用来指定当前包的依赖范围和以来的传递性,其取值包括compile、provided、runtime、test、system,其中provided和test无法传递相关依赖,因此如果C的scope为provided或test,传递依赖于C的A将直接舍弃C。这里面system和runtime的作用范围需要仔细区分,system表示一个可运行系统,因此其依赖范围时compile和runtime

Q:dependencies和dependencyManagement的区别
dependencyManagement主要用于父工程中做版本管理,其不会导入相关的包,因此子工程即使继承了该父工程,也需要显式声明对应包;dependencies只要被继承,其所有的包也会直接被继承

最后问了一个Git相关的问题:

Q:fetch和pull的区别?
A:fetch和pull都是拉取远端最新分支,但fetch拉取后还需要人确定才合并,而pull是直接合并

你可能感兴趣的:(Java笔记随录,java,redis,开发语言)