【置顶】高级后端工程师精品面试题——持续更新

小滴课堂——小D老师 2.1K 0

1、mysql性能调优-离不开执行计划explain分析,下面说法正确的是?

A.lnnoDB支持事物,而MyISAM不支持事物

B.InnoDB支持行级锁,而MyISAM支持表级锁

C.InnoDB支持MVCC,而MyISAM不支持

D.InnoDB支持外键,而MyISAM不支持

2、浏览器同源策略,前后端分离情况下,前端页面是xdclass.net,后端接口路径哪个会出现跨域问题

A.api.xdclass.net

B.xdclass.net:8888

C.ws://xdclass.net

D.https:xdclass.net

解析

浏览器从一个域名的网页去请求另—个域名的资源时,域名、端口、协议任一不同,都是跨域

3、ReentrantLock和synchronized有交集,下面说法正确的是?

A.synchronized是悲观锁会引起其他线程阻塞,java内置关键字

B.synchronized无法判断是否获取锁的状态,锁可重入、不可中断、只能是非公平

C.ReentrantLock需要手动加锁和解锁,且解锁的操作尽量要放在finally代码块中,保证线程正确释放锁

D.ReentrantLock创建的时候通过传进参数true创建公平锁,如果传入的是false或没传参数则创建的是非公平锁

4、javase集合框架里面Map 说法正确的是

A.JDK8之前,ConcurrentHashMap使用锁分段技术,将数据分成一段段存储,每个数据段配置一把锁,即segment类

B.JKD8的版本取消Segment这个分段锁数据结构,底层也是使用Node数组+链表+红黑树,对每一段数据就行加锁,减少了并发冲突的概率,CAS(读)+Synchronized(写)

C.ConcurrentHashMap是线程安全,但是他的效率比Hashtable要差很多

D.按照添加顺序使用LinkedHashMap,按照自然排序使用TreeMap,自定义排序TreeMap(Comparetor c)

解析

ConcurrentHashMap是线程安全,但是他的效率比Hashtable要【高很多】

5、javase集合框架里面CopyOnWriteArrayList<>()说法正确的是

A.集合在执行修改操作时,会拷贝—份新的数组进行操作,在执行完修改后将原来集合指向新的集合来完成修改操作

B.读高性能,适用读操作远远大于写操作的场景中使用,读的时候是不需要加锁的,直接获取,删除和增加是需要加锁的,读多写少

C.该类的设计思想是读写分离+最终—致

D.缺点是内存占用问题,写时复制机制,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象,如果对象大则容易发生Yong Gc和Full Gc

6、开发好的应用基本离不开域名备案和应用上线,下面说法正确的是

A.DNS 网络中的计算机之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器

B.A记录用户可以在此设置域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器(也叫ip指向域名配置) aabbcc.com-> 120.24.216.117

C.CNAME可以为一个主机设置别名。比如设置open1024.com,用来指向一个主机xdclass.net那么以后就可以用open1024.com来代替访问xdclass.net

D.DNS域名解析使用的是协议是UDP协议

解析

UDP的DNS协议只要一个请求、—个应答就好了,而使用基于TCP的DNS协议要三次握手、发送数据以及应答、四次挥手

7、RabbitMQ高可用普通集群模式,下面说法正确的是

A.RabbitMQ默认的集群模式,比如有节点node1和node2、node3,三个节点是普通集群,但是他们仅有相同的元数据,即交换机、队列的结构;

B.RabbitMQ的普通集群,该模式更适合于消息无需持久化的场景,如日志传输的队列

C.RabbitMQ的mirror镜像集群和普通集群比较大的区别就是【队列queue的消息message 】会在集群各节点之间同步

D.RabbitMQ的镜像集群,由于镜像队列模式下,消息数量过多,大88量的消息同步也会加大网络带宽开销,过多节点的话,性能则更加受影响

8、RabbitMQ消息队列在高并发项目中大量使用,下面说法正确的是?

A.RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端如:Python、Ruby、.NET、Java.在易用性、扩展性、高可用性等方面表现不错

B.RabbiMQ的虚拟主机主要是用于区分环境,同个虚拟主机下可以有相同的交换机就和队列

C.生产者将消息发送到Exchange,交换机将消息路由到—个或者多个队列中,交换机有多个类型,队列和交换机是多对多的关系

D.交换机只负责转发消息,不具备存储消息的能力,如果没有队列和exchange绑定,或者没有符合的路由规则,则消息会被丢失

解析

同个虚拟主机下不可以有相同的交换机就和队列

9、Web安全的常见漏洞介绍SQL注入,下面说法正确的是?

A.危害大,攻击者通过SQL注入获取到服务器的库名、表名、字段名,从而获取到整个服务器中的数据

B.MyBatis支持两种取参数符号,一种是#,另一种是$;使用参数符号$时不容易产生SQL注入

C.不要信任用户的输入,对输入参数进行校验,可以通过正则表达式或限制长度

D.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息

解析

使用是#{param}不容易产生SQL注入,${param}容易产生SQL注入漏洞

10、如何保证团队所负责的业务稳定运行,下面说法正确的是?

A.团队灌输思想,稳定性是技术人员的生死线,是最重要的技术kpi

B.强调变更三板斧:可监控、可灰度、可回滚,不允许"三无发布"

C.定级和复盘,确认事故级别和责任人,提出改进措施、避免下次再犯

D.出现故障接口响应慢,直接重启当前服务再验证是否正常

解析

禁止不思考重启回滚-防止二次故障引入

11、面试的时候,如果被问为啥离职-下面哪个回答不推荐

A.公司从当前城市搬走了,撤回总部,家人都在这边

B.入行就一直比较喜欢这个领域且对公司有好感,所以一直想进公司

C.公司技术太Low了,一直用SSH做了三年不喜欢

D.公司被收购了,直接把全部技术人员换掉了

解析

公司技术太老了,做了三年不喜欢,证明自己的技术也不怎么样,做了好几年都是老技术

12、关于Nginx和业务Spring Cloud Gateway的说法,下面哪个是错误的

A.nginx和Spring Cloud Gateway在功能上是有一些重叠的地方,但是各司其职互相配合会更强大

B.有部分复杂业务逻辑Nginx解决不了,用java语言开发模块,加入到Spring Cloud Gateway中

C.Nginx配置HTTPS证书更灵活、Openresty+Lua开发各个强大的功能模块

D.完全没必要两个—起用,直接用Spring Cloud Gateway就行

解析

Gateway是业务网关,针对SpringCloud体系专门推出,但是如果有其他服务不是用Cloud开发就需要用Nginx接入

13、云计算服务三层架构-laaS-PaaS-SaaS说法不正确是?

A.laaS基础设施即服务lnfrastructure as a service如虚拟的主机、存储、网络、安全等资源

B.PaaS平台即服务platform as aservice,比如阿里云OSS.RDB、短信服务、日志服务

C.SaaS软件即服务software as aservice,比如小鹅通、亚马逊,CRM(客户关系管理)、HRM(人力资源管理)

D.公司基于laaS层做研发需要的技术人员是三者中最少的

解析

laaS层做研发是需要技术人员最多的,saas才是需要技术人员最少的

14、下面哪个不是设计模式的里面的六大原则

A.单一职责原则、开闭原则

B.里氏替换原则、依赖倒转原则

C.接口隔离原则、迪米特法则

D.低内聚原则、高耦合原则

解析

单一职责原则里面是的高内聚、低耦合

15、关于延迟队列的应用场景,哪些是正确的

A.通过消息触发一些定时任务,比如在某一固定时间点向用户发送提醒消息

B.天猫电商交易中超时未支付关闭订单的场景

C.用户登录之后5分钟给用户做消息推送

D.海量请求的秒杀业务中,使用MQ延迟队列削峰

解析

海量请求的秒杀业务中,使用MQ削峰不应该是使用延迟队列

16、分布式事务框架Seata核心组件的说法正确的是

A.TC: Transaction Coordinator 事务协调器,管理全局的分支事务的状态,用于全局性事务的提交和回滚

B.TM: Transaction Manager 事务管理器,用于开启、提交或者回滚【全局事务】

C.RM: Resource Manager资源管理器,用于分支事务上的资源管理,向TC注册分支事务,上报分支事务的状态,接受TC的命令来提交或者回滚分支事务

D.TC为单独部署的Server服务端,TM和RM为嵌入到应用中的Client客户端

17、分布式事务出现了很多对于的框架,下列哪个不是分布式事务框架

A.TX-LCN

B.Seata

C.RocketMQ

D.gRpc

E.GTS

解析

RocketMQ是自带分布式事务功能,gRpc是RPC远程调用框架,GTS是seata的阿里云商业化版本

18、数据最终—致性理论BASE理论中的E,下列哪个解释是正确的?

A.假设系统,出现了不可预知的故障,但还是能用,可能会有性能或者功能上的影响,比如RT是10ms,变成50ms

B.允许系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性,即允许系统在多个不同节点的数据副本存在数据延时

C.系统能够保证在没有其他新的更新操作的情况下,数据最终—定能够达到一致的状态,因此所有客户端对系统的数据访问最终都能够获取到最新的值

解析

Basically Available(基本可用),Soft state(软状态),Eventually consistent(最终一致性)

19、自营平台电商购物车数据存储Redis里面,满足多个商品购买、每个商品可以买多件,应该用Redis哪个结构存储比较好

A.list

B.Hash

C.Set

D.SortedSet

解析

Map> 第一层Map,Key是用户id,第二层Map,Key是购物车中商品id,值是购物车数据

20、关于电商购物车存储数据常见的实现方式,下列说法正确的是?

可以存储到关系型数据库,性能存在瓶颈

前端本地存储-localstorage-sessionstorage,但是容易丢失数据

后端存储到缓存如redis,可以开启AOF持久化防止重启丢失

后端存储到缓存如redis-并同步更新到数据库,加了用户唯一标识后,没高并发操作同一数据的导致不一致

21、Mysql数据库的默认事务隔离级别是?

READ_UNCOMMITTED

READ_COMMITTED

REPEATABLE_READ

SERIALIZABLE

解析

MYSQL: 默认为REPEATABLE_READ级别

22、数据库事务传播级别说法正确的是

@Transactional(propagation=Propagation.REQUIRED) 如果有事务, 那么加入事务, 没有的话新建一个(默认 情况下)

@Transactional(propagation=Propagation.MANDATORY) 不为这个方法开启事务

@Transactional(propagation=Propagation.REQUIRES_NEW) 不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务

@Transactional(propagation=Propagation.SUPPORTS) 如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.

解析

@Transactional(propagation=Propagation.MANDATORY) 必须在一个已有的事务中执行,否则抛出异常

23、设计分布式锁应该考虑哪些方面

排他性:在分布式应用集群中,同一个方法在同一时间只能被一台机器上的一个线程执行

容错性:分布式锁一定能得到释放,比如客户端奔溃或者网络中断

需要满足 不可重入、高性能、高可用

注意分布式锁的开销、锁粒度

解析

24、高并发库存扣减超卖问题,很多人加了乐观锁版本号去解决,也需要避免ABA问题,那下面哪个是正确的SQL

update product set stock=stock-1 where id = 1

update product set stock=stock-1 where stock=#{原先查询的库存} and id = 1 and stock>0

update product set stock=stock-1,versioin = version+1 where id = 1 and stock>0 and version=#{原先查询的版本号}

解析

A的存在扣减为负数的情况,B的使用业务自身的条件做为乐观锁,但是存在ABA问题

25、关于"水平越权"和"垂直越权"的说法正确的是?

攻击者尝试访问与他拥有相同权限的用户的资源是 "垂直越权"

A用户可以直接操作到B用户的数据是 "水平越权"

一个低级别攻击者尝试访问高级别用户的资源是 "水平越权"

普通管理员登录,拼接浏览器地址,直接访问高级管理员的⻚面是 "垂直越权"

解析

26、关于ThreadLocal和Synchronized的说法正确的是?

都是为了解决多线程中相同变量的访问冲突问题

Synchronized是通过线程等待,牺牲时间来解决访问 冲突

ThreadLocal是通过每个线程单独一份存储空间,牺牲 空间来解决冲突

对比Synchronized,ThreadLocal具有线程隔离的效 果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值

27、JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法,由哪几部分组成

header

payload

signature

body

解析

28、下面那些是加密算法属于非对称加密

MD5

RSA

SHA256

AES

29、互联网企业中基本离不开Postman的使用,包括哪些功能

Http接口调试

接口自动化测试

接口响应断言

接口管理

局部变量和全局变量管理

解析

30、互联网公司中企业开发,经常有N方库,二方库的解释是哪个

本工程内部子项目模块依赖的库(jar 包)

公司内部发布到中央仓库,可供公司内部其它应用依赖 的库(jar包)

公司之外的开源库(jar 包)

隔壁组-小滴课堂老王开发的包

31、Mysql有多种常见的日志,下面说法正确的是?

redo 重做日志,确保事务的持久性,防止在发生故障,脏页未写入磁盘。重启数据库会进行redo log执行重做,到达事务一致性

undo 回滚日志,保证数据的原子性,记录事务发生之前的数据的一个版本,用于回滚。innodb事务的可重复读和读取已提交 隔离级别就是通过mvcc+undo实现

binlog 二进制日志,作用:用于主从复制,实现主从同步

slow query log 慢查询日志,记录执行时间过长的sql,时间阈值可以配置,只记录执行成功

32、java多线程里面常用的锁很多,下面说法正确的是

共享锁:也叫读锁,能查看但无法修改和删除的一种数据锁,加锁后其它用户可以并发读取、查询数据,但不能修改删除数据,该锁可被多个线程所持有,用于资源数据共享

互斥锁:也叫X锁/排它锁,锁每一次只能被一个线程所持有,加锁后任何线程试图再次加锁的线程会被阻塞,直到当前线程解锁,获得互斥锁的线程即能读数据又能修改数据

公平锁:指多个线程按照申请锁的顺序来获取锁,一个线程组里,能保证每个线程都能拿到锁 比如ReentrantLock只能是公平锁(底层是同步队列FIFO:First Input First Output来实现)

非公平锁:获取锁的方式是随机获取的,保证不了每个线程都能拿到锁,也就是存在有线程饿死,一直拿不到锁,比如synchronized、ReentrantLock

解析

ReentrantLock是可重入锁,支持可公平和不公平的方式

33、常见的接口压测工具有哪些?

LoadRunner

Apache AB

Webbench

Jmeter

Prometheus

解析

prometheus是一个开源的服务监控系统和时间序列数据库

34、javase集合框架如果需要保证线程安全,ArrayList应该怎么做,下面说法正确的是

自己写个包装类,根据业务一般是add/update/remove加锁

ArrayList本身就是线程安全的,不用做其他操作

使用 Collections.synchronizedList(new ArrayList<>()); 内部使用synchronized加锁

使用CopyOnWriteArrayList<>(),内部使用ReentrantLock加锁

解析

ArrayList:底层是数组实现,线程不安全,查询和修改非常快,但是增加和删除慢

35、开发好的应用基本离不开 域名备案和应用上线,下面说法正确的是

DNS 网络中的计算机之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS 就是进行域名解析的服务器

记录用户可以在此设置域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器(也叫ip指向域名配置)aabbcc.com -> 120.24.216.117

CNAME 可以为一个主机设置别名。比如设置open1024.com,用来指向一个主机 xdclass.net 那么以后就可以用open1024.com来代替访问 xdclass.net

DNS域名解析使用的是协议是UDP协议

解析

UDP的DNS协议只要一个请求、一个应答就好了,而使用基于TCP的DNS协议要三次握手、发送数据以及应答、四次挥手

36、RabbitMQ的可靠性投递,下面说法正确的是

生产者只要把消息投递出去,就可以保证消息百分百发送到消息队列中去

RabbitMQ消息投递路径 生产者->交换机->队列->消费者,每个节点都需要保证可靠性

生产者到交换机,通过confirmCallback可以监听到投递状况

交换机到队列,通过returnCallback可以监听到投递状况

37、RabbitMQ的topic主题通配符模式,* 代表一个词,#代表1个或多个词,下面说法正确的是

路由健 quick.orange.rabbit 会匹配 *.orange.* 和 *.*.rabbit

路由健 lazy.orange.elephant 会匹配 *.orange.* 和 lazy.#

路由健 lazy.orange.male.rabbit,会匹配 lazy.#

lazy.pink.rabbit 会匹配 lazy.#和*.*.rabbit

解析

交换机同过通配符进行转发到对应的队列,* 代表一个词,#代表1个或多个词,一般用#作为通配符居多,比如 #.order, 会匹配 info.order 、sys.error.order, 而 *.order ,只会匹配 info.order, 之间是使用. 点进行分割多个词的; 可以看小滴课堂"RabbitMQ高可用专题"

38、自Spring3.1起,提供了类似于@Transactional注解事务的注解Cache支持,关于SpringCache说法错误的是

提供基本的Cache抽象,方便切换各种底层Cache

一个是Cache接口,定义缓存操作的API;一个是CacheManager管理各类缓存,有多个缓存框架的实现

@CacheEvict 注解是读取的数据放到缓存中

@CachePut 应用到写数据的方法上,如新增/修改方法,调用方法时会自动把相应的数据放入缓存

解析

@CacheEvict 清空对应的缓存

39、分布式缓存在高并发中大量使用,下面关于缓存说法不正确的是?

缓存击穿:查询一个不存在的数据,由于缓存是不命中的,并且出于容错考虑,如发起为id为“-1”不存在的数据

缓存穿透:缓存中没有但数据库中有的数据,假如是热点数据,那key在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大

缓存雪崩:大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩

缓存穿透解决方案:设置热点数据不过期,定时任务定时更新缓存,或者设置互斥锁

解析

A和B的概念互换才对,D缓存穿透解决方案:接口层增加校验,数据合理性校验,将key-value对写为key-null,设置短点的过期时间

40、为了解决容器管理的问题,就有了容器编排管理工具,下面哪个不是容器编排工具

Docker Swarm

Apache Mesos

Kubernetes

Service Mesh

解析

Service Mesh又译作“服务网格”,作为服务间通信的基础设施层

41、下面关于云计算特点说法不正确是?

虚拟化:将一台计算机虚拟为多台逻辑计算机,相互独立的空间内运行而互不影响

动态可扩展:能够使计算速度迅速提高,最终实现动态扩展虚拟化的层次达到对应用进行扩展的目的

按需部署:云计算平台能够根据用户的需求快速配备计算能力及资源

按部署形式可以分为 IaaS、PaaS、SaaS

解析

按部署形式 公有云/私有云/混合云

42、分布式事务框架Seata中TC需要存储全局事务和分支事务的记录

TC:Transaction Coordinator 事务协调器,管理全局的分支事务的状态,用于全局性事务的提交和回滚

TM:Transaction Manager 事务管理器,用于开启、提交或者回滚【全局事务】

RM:Resource Manager 资源管理器,用于分支事务上的资源管理,向TC注册分支事务,上报分支事务的状态,接受TC的命令来提交或者回滚分支事务

TC 为单独部署的 Server 服务端,TM 和 RM 为嵌入到应用中的 Client 客户端

43、分布式事务的解决方案之一TCC 的说法正确的是?

TCC是柔性事务,遵循BASE理论

TCC是指 try、Cancel、Confirm

TCC中的T做的是 完成所有业务检查( 一致性 ) ,预留必须业务资源( 准隔离性 )

TCC 事务和 2PC 的类似,Try为第一阶段,Confirm - Cancel为第二阶段

解析

TCC是指 try、Confirm、Cancel

44、分布式事务产生的原因有哪些

业务发展,数据库的拆分-分库分表

SOA和微服务架构的使用

多个微服务之间调用异常,如网络异常、请求超时、数据库异常

单体项目里面操作多个数据库

45、自营平台电商购物车数据存储Redis里面,满足多个商品购买、每个商品可以买多件,应该用Redis哪个结构存储比较好

list

Hash

Set

SortedSet

温馨提示

Map> 第一层Map,Key是用户id,第二层Map,Key是购物车中商品id,值是购物车数据

46、设计分布式锁应该考虑哪些方面

排他性:在分布式应用集群中,同一个方法在同一时间只能被一台机器上的一个线程执行

容错性:分布式锁一定能得到释放,比如客户端奔溃或者网络中断

需要满足 不可重入、高性能、高可用

注意分布式锁的开销、锁粒度

解析

C的需要满足 【可重入】、高性能、高可用

47、一个几百人的公司做AI医疗影像识别的,需要存储用户的CT拍片,但使用一次后相对少用,选择使用OSS存储,下面说法错误的是

用低频访问存储类型

用归档存储数据

标准存储类型和归档存储数据类型都行

标准存储类型和冷归档存储类型都行

温馨提示

归档数据,在存储周期内极少被访问,数据进入到可读取状态需要 1分钟的解冻时间。适合需要⻓期保存的档案数据、 医疗影像、科学资料、影视素材。
冷归档存储类型,需要超⻓时间存放的极冷数据,需要⻓期留存的数据、大数据及人工智能领域⻓期积 累的原始数据、影视行业⻓期留存的媒体资源、在线 教育行业的归档视频等

48、一个小公司总共有30个技术人员,做一个面向百万用户的C端产品,需要搭建一个分布式文件存储系统,哪个方案比较适合他们

开源版本的MinIO

开源版本的FastDFS

购买阿里云的OSS+CDN

直接安排技术人员进行自研分布式文件存储

解析

团队规模小,但是对文件存储需求大,且当下不适合投入太多人力去研究分布式存储,选云厂商的话开发简单,功能强大,容易维护

49、用户注册登录服务,会发送短信验证码,为了避免同个用户重复发送,哪个方法最优?

前端增加校验倒计时,不到60秒按钮不给点击

发送的存储验证码,然后再增加额外的key设置已经发送过,并且60秒后过期

基于原先缓存key,拼装时间戳,格式: 验证码_过期时间戳

无所谓-公司有钱任他发送

温馨提示

A的简单不安全,存在绕过的情况;B非原子操作,存在不一致性 增加的额外的key - value存储,浪费空间;C满足了当前节点内的原子性,也满足业务需求

发表评论 取消回复
表情 图片 链接 代码

分享