【最新2019年5月阿里面试笔录】菜鸟网络一面

1.说说你的项目中遇到的比较有代表性的问题,或是亮点

对于百万并发的项目,如何将这个请求均衡分发到后端的每个tomcat服务,让这尽量少的节点均衡承担最多的并发是需要考虑的

2.既然谈到分发,那你所知道的负载均衡分发策略有哪些,列举一下

这个比较经常用的就是轮询和哈希,其它的就记不大清楚了

3.redis为什么可以有十万的并发,你是怎么知道它可以到十万的,它相较于mysql性能优越,为什么优越,关键在哪里

mysql需要做持久化,会有磁盘io, 而redis是直接在内存里面,不需要即时对每条指令都做持久化,它只是需要定时的快照存储balabala...

4.那既然提到redis的持久化,那你说说redis的持久化方式是什么

印象当中,有aof以及rd什么的,记不清楚了,但知道这两种方式大致是什么原理

5.是有aof和rdb两种方式,那你知道这两种方式的原理吗,分别讲一讲

其中一种rdb的方式是利用快照的方式进行落盘持久化的,而aof是fork出一个单独的持久化进程,用类似于mysql这种binlog这种操作日志进行逐条存储的

6.那你知道aof是每条操作日志进行存储,它有可能是无限增长的,会越来越大,这里redis有没有做一些优化什么的

它的持久化进程在重新存储操作日志的时候,会边解析边把对某一个相同key的更新删除的最后一次操作保留下来,而丢弃之前同类的操作,做了一个过滤压缩的处理。

7.你知道redis是怎么做分片扩容的,又有一些怎样的扩容策略

我们通常分片扩容会采用哈希的一种方式,那么扩容的话,会是乘以2的去扩,比如4台会扩到8台

等一下,必须得2去扩容吗,比如我现在就有4台redis服务器,我刚好需要加一台就可以承载,不能加一台吗,就是一致性哈希的思想

 

6.好,那么现在如果说将redis的一个接近十万读写的业务场景的数据需要同步到mysql,你会怎么做

答:首先,如果是这么大一个并发的写数据到mysql,它肯定是承受不了的,会达到mysql的性能瓶颈,这里我想到的是在更新redis之后将mysql的更新操作发送到mq,通过队列去削峰,缓冲的去处理数据的写请求。

7.那么现在问题来了,通过队列放数据库,数据存在不一致的现象,如果现在也需要很即时的去读数据,你又需要怎么做呢

答:通常需要即时读的数据,就直接先从redis去读,能够容忍延迟数据的情况,就从mysql去读,当然我们需要直接读取存到db节点的最新数据也可以用es做中间层

7.现在mysql有一套主备数据库,通常来讲,主从之间存在不一致,那么为什么它们会不一致

首先从mysql的内部原理来讲,mysql内部是有一个单独的进程,就这个线程...

被打断问:到底是进程还是线程

额,是线程...

好,那你说一下进程和线程的区别

进程之间是不共享堆栈内存的,内存是相对独立的,而线程之间的内存是可以互相访问的,只是需要自己把控同步的问题

那你先把刚才的问题接着讲完

mysql的这个同步线程会监听这个binlog操作日志,然后通过发送请求到从库,从库会对这些操作日志进行数据的同步。

8.那么刚才既然谈到了同步问题,你说一下乐观锁和悲观锁的区别

乐观锁是... 额...概念记得不是很清楚了,

9.那你说一下你所知道的有哪几种锁

互斥锁,cas就是自旋锁,读写锁

10.既然谈到互斥锁,那你说一下synchronized和ReentrantLock的区别

synchronized可用来修饰对象和接口,ReentrantLock用来修饰某一个代码段

synchronized只能修饰接口吗,不也可以用在代码段的,好吧,就问下一个吧

11.那你说说分布式锁的原理和核心点是什么,为什么能实现分布式锁

我所知道的比如用redis可以实现分布式锁

那你说说redis是如何实现分布式锁的,关键点是什么

用到的setnx,首先它可以去对key进行加锁,第二它在获取锁的期间如果自己意外挂掉了,为了以防其它服务在等待获取它的锁的过程中产生死锁,这里加入了超时机制balabala...

又被打断说到,还是没有说到关键,关键其实就是它操作的原子性以及是如何保证原子的

12.既然说到分布式,那你对分布式事务有什么看法吗

首先说说分布式事务的常见几个方案,二阶段提交,tcc的这种补偿,以及消息方案的可靠最终一致,再到优点兼具的GTS,如果不是使用很复杂,侵入性高这种考虑的话,会倾向使用消息的这种方案

那你说一下,消息的这种方案,是如何保证顺序的,或者说会不会存在消费顺序的问题,如何解决

这个问题首先讲了,rocketmq是不同于其它mq有一个生产消息和确认发送消息的机制,能够保证在一次事务当中,消息是能够发送出去的

这么来说这个问题吧,就比如,我现在一个业务场景有多个服务的操作需要按顺序去消费,又是如何保证顺序的,单个线程吗

是不是说就比如我开始了一组事务,我操作了本地服务,然后其余的服务操作会通过队列发送好几条消息往下消费,如何保证顺序消费的

恩,也可以这么讲

这种情况的话...    单线程是一种做法,可能就又需要用一个协调器去协调这多个服务的顺序了(就有点问懵了...)

13.好吧,最后我来问两个算法问题

从这样一组123245。。数中,如何高效的挑出一组最大的排列最大的数,挑取的任意两个数之间不相邻,说一下思路就可以

额...  想了好一会儿

就这个也可以先简单讲讲使用到的算法,比如用到树,递归还是什么算法。。。

好吧,也不是很清楚

这里你可能需要下面去想一下,需要用到的是动态规划。

 

14.我问的都差不多了,剩下你需要问我什么的吗

balabala大概说了两三个问题,完...

 

 

        总的来讲,整个面试过程,面试官提问思路还比较清晰,沿着项目一条线进行逐步深入,并且还可以延展的问到相关的技术知识,这里记下来,方便后续随时回顾自己的不足,在这里看到的问题,欢迎各位童鞋积极讨论。

 

 

 

 

 

 

 

 

你可能感兴趣的:(面试题)