分享最近一次面试所涉及到的问题

最近收到一家上市公司的面试邀请函,如期去面试了,但是没能通过,有点遗憾吧,但是也不是说完全浪费时间,还是有所收获的吧,下面我把它记录下来,给大家做个参考,或者大伙看后有什么建议也可以给我留言吧。

总的来说,主要是问了很多实践方面的东东,主要是一些架构方面的知识,无奈被业务包围的我比较少接触得到,提到的基本都知道,但是往深了问就踩坑了。下面看下主要问了些什么吧。
 1. 简单的自我介绍下
我是XXX,来自XXX,这些年主要做的是那块的业务等等,这里就不详细说明了,在一番简单的介绍完后面试官开始提问了。


问题1: 你做的网站日PV有多大?
答: 没有统计过,不过我们的网站用户挺多的(用户数上亿),大概有上万吧(蒙的)。现在想想这个日PV应该说得太少了。。
注: PV表示Page View,指的是访问量,即页面浏览量或点击量,比如一个页面被同一个用户访问3次那么PV的值会加3。那么日PV就是每天网站的访问量。


问题2: 你们的网站这么多用户是怎么去处理高并发的呢?
答:首先我们有三条业务线xxx1,xxx2,xxx3 这三条业务线加起来有这么多(上亿)的用户,我做的那个网站是其中一个,所以并不是所有的用户都会走到我这做的这个网站上来,那具体到我做的网站呢,首先我们是有两台机去部署我们的网站,数据库进行了读写分离,php-fpm配置多些woker进程,另外对于一些需要调用go服务的一些应用,针对go服务也会启动几个进程,并且会使用redis做缓存,没了。
我自我感觉这答得比价抽象,也比较简单;当然面试官也不太满意这个答案,于是接着问:

问题3:你们的数据库是使用的MySQL吧,那是怎么实现高可用的呢,就是比如主服务器挂了呢?
答:是的,我们的数据库是使用的MySQL,我们一般会做MySQL集群,当一台主的机器挂了就会自动启用从库。
这个问题当然不会这么快就过关了,面试官接着又问:那能讲讲具体是怎么做的么?
emem....,具体没配置过,我们有运维去处理,我们一般会告诉他们需求,然后他们帮我们去配置。说完感觉有点凉凉了。
笔者面试完后查阅了一些MySQL高可用的资料,后面会更新相关的文章,这里不详细说明了。


问题4: 那我看你做了一些活动,怎么去防止一些抢购带来的问题呢(比如说超卖)?
答: 首先我会在数据库那个库存字段加上一个限制,不让库存变为负数。其次,我会将库存放到redis队列里面去将并发的操作转化为有序的操作。em.. 是乎差了点意思。面试官接着问:那很多请求同时到来的时候在从redis里面取数据还是并发的呀?   em....,我们会加锁,我们会使用setex 一个key,这个key的值是一个随机数。这个答案貌似还行,于是面试官问到: 那你们是这样去实现的么? 答:是的。


问题5: 谈谈你对索引的认识?
答: 索引是为了加快数据的查询,但是索引的维护也会消耗一些性能,所以建索引的时候要认真考虑一番,比如:可以针对经常需要检索的字段加上索引,当然索引如果是建立的那个字段数据重复性是很大的话建索引就没有什么意义了;在比如可以针对多个字段建立联合索引之类的;索引也分很多类型;像:主键索引,唯一索引,联合索引,覆盖索引等等。em... ;面试官接着又问道:索引的一些底层结构, 答: mysql主要是使用B+tree来实现索引,至于为啥会使用B+tree 来作为底层的实现,本人的理解是:为了提高磁盘I/O的效率,就和二叉树想比的话,从磁盘取同样多的数据出来,B+tree由于是多叉数且每个非叶子节点只存储索引所以这样就更有利于数据的查找,二叉树的话就不具有这样的特性,并且当数据分布不均匀的时候可能会导致只有左腿或者右腿,那这个时候就退化成了一个链表,当数据量比较大的时候查找效率是很低的。当然这里答得比较少,应该还加上比如b+tree所有的叶子节点是链接起来的,所以针对一些排序和范围查询效率也是比较高的。


问题6: 那你们web服务器是使用nginx还是apache?
答:nginx


问题7: 那关于nginx是怎么去做防刷和负载均衡的?
答:防刷的话我这边主要是在代码里面借助redis来实现的,至于nginx的话就配置一些策略喽。那是具体是怎么配置的呢?em.... 这个没配置过。。。,关于负载均衡的话的话也可以设置一些策略,不过也没实践过。感觉凉凉。。


问题8: 那关于一些分布式微服务这块呢?因为我们也在逐渐往这个方向走
答: 我本人也参与过微服务的开发,我们的微服务是用go去开发,比如你做好了一个发放代金券的微服务,我们就会起几个进程挂载到不同的机器或者是同一台机器的多个不同的端口,然后将这个服务的地址和端口上报给etcd,然后服务的发现的话,我们是根据服务对应的key去查找的。那这个微服务不是对外开放的吧? 答:不是,是服务端对服务端的调用,(其实答得不够全面,我们也提供给客户端去调用了,对于客户端的调用是配置一个链接地址,访问这个链接地址的请求会先到nginx,然后nginx通过upstream 转发给后端go程序)。


问题9:那我看你有使用过kafka?
答: 对,举个例子,比如用户针对某些评论做了回复我们会把这条回复的消息发送给kafka,那如果有个业务是只要用户回复了这个评论我们就给他发奖励的话,我们可以用程序去监听kafka下对应的主题消息,然后进行相关的操作。不过具体kafka 的一些原理方面可能就没怎么研究过。


问题10: 你们的redis是使用什么持久化的方式?
答:持久化主要有两种:一种是rdb,一种是aof,我们使用的是aof(这个答案不是很准确,我应该这么说:默认会使用rdb,如果你开启了aof的话,就会优先使用aof,开启了aof实际上也不要关闭rdb吧,出于安全性的考虑),因为rdb是全量的,尽管是开启一个子线程去做这些事,但是数据量比较大的话,影响还是比较大的,aof的话就最多丢失一秒的数据。当然,笔者针对这两种持久化的方式没有过多的去研究,这里说的也不完全正确吧。

以上就是这次面试中问到的一些问题,自我感觉答的不怎么样?就是一些细节上面答不上来吧,可能是自己准备也不怎么充分吧。
总结:
以上的涉及到的一些问题,笔者都有涉猎到吧,可能就是不够深入,答得时候很容易踩坑。后面的工作中会多深入思考一些问题,另外,面试的话不是花一些时间去突击就可以了,笔者更倾向于在日常的工作中做一些深入的思考并加以实践吧。针对以上提的一些问题后面笔者会更新相关的文章,既然都遇到了就要去解决它。
大伙有什么建议,欢迎在下面给我留言哦,看到会回复的。



posted @ 2020-06-03 17:02  xiaoxiaaaa  阅读(73)  评论(0编辑  收藏  举报