深信服C++秋招一面复盘 9-16
背景:深信服MSS海外组——后端开发实习
本次面试,重点围绕实习期间的需求:ip2region微服务化改造需求深入探讨。本菜鸡觉得压力满满,全程斯米马赛,感觉蛋了个糕。
(注:复盘时候发现录像忘记录本地音了woc,之前面百度也是现在也是- -, 只能尽量去回忆当时说了什么)
(再注:面试是面试官的摄像头一闪一闪亮晶晶的(绿屏花屏),把我眼睛闪瞎了)
(继续住:简历上根本没有写了解分布式理论,笑死。)
面试内容
- 介绍一下自己
- 背到烂的自我介绍
- 介绍一下ip2region
- ip2region我们海外组的一个需求,因为之前只服务国内,所以地理位置信息只有中文,现在第三方服务商提供了一个英文的更全的离线包,不过这个包太大了,组长就让我起一个微服务,对内提供ip地理位置映射接口(忘了面试咋说的了,差不多是这样)。
- 你的这个微服务是用什么语言写的,平台是什么?(???平台- -,我能理解成注册中心吗)
- Python,注册中心用的consul。
- 只是用的注册中心是吧?那服务的访问呢?
- 我们部门有人将consul的服务注册服务发现服务监控等封装成包了,我只需要调用这个包提供的方法就行,不过这个包的具体实现我还是看过他的源码的。
- 为什么用的consul?(first blood,已经不会了。。)
- (沉默是金)呃。。。我从分布式一致性方面来说吧,consul他是强一致性和有分区容错性的,牺牲了高可用性。可能是因为这个原因?
- 那为什么不保证高可用呢?(double kill,9m我不会分布式原理aaaaaaa)
- (胡说八道ing),可能是我们的产品面向的b端,流量不是很大,可能没有高可用也可以(复盘后翻译的人话:对高可用没有很强烈的需求),反而是对强一致性有需求。(这答的啥这是。。。)
- 不需要高可用为什么需要分区容错性?(trible kill????别问了哥,人已经不好了,已经感觉寄了)
- 额,我不知道。
- 你怎么理解分区容错性?(听我说谢谢泥,(bushi),这个我背过,直接八股)
- consul的分区容错性首先他的所有请求需要半数以上的节点同意才能生效,当发生网络分区,假设分成两个区域,那么超过一般节点的那个分区将会生效。(这里面试的时候说错了,说成没有leader分区的那个分区会选举出新leader,--)假如超过有一半节点的那个分区没有leader,就会自动选取出一个新leader。我的理解是分区容错性不能保证高可用,因为另外一个少于半数节点的分区,无论有多少请求,都不会成功。这就保证了分区容错性。(个人理解啊,如果有误麻烦大佬们指正qaq)
- 那他跟高可用有什么区别?
- 不会,忘记怎么回答了(个人理解是高可用可以保证服务请求成功,比如说之前b站崩溃就导致了可用性为0。)
- 按我的理解一般来说用户对高可用还是要求很高的。为什么你们要舍弃高可用而保证了一致性?
- 解答同5(为什么要反复鞭尸啊)
- 有看过Raft算法嘛?
- 有的,我在接到这个需求的时候有查资料了解过这个分布式一致性算法。
- 有看过代码嘛?(听我说。。。不听了已经麻了)
- 这个没有。。。
——————————————
- 好的,你的ip2region这个东西,提供了ip地址映射,这个映射是什么呀?(终于问别的了,我哭死)
- 这个是根据IP地址返回对应的地理位置信息。
- ip地址量有多大?
- 里面应该记录了全球范围的ip地址。
- 他的ip信息会有多少呢?
- 这个数据是第三方提供的离线数据包,具体我不太清楚。
- 都是ipv4地址嘛?
- 是的之前只实现了ipv4的。
- 你的离线包,他一定有4个255的内容嘛?
- emmm,应该有地址分类或者可能有想同一子网地址相同的情况,就可以合并记录成一个地址区间。(当时已经说的语无伦次了)
- 对于ip地址段,你是怎么匹配的呢?(草,是绿色的)
- 额,我不太清楚,我有去查找相关资料,他离线包里面的内容大概划分成了索引区和数据区,我想应该是先从索引区找到对应ip的内容区的地址,再到内容区读取响应内容,这样就能匹配到地理位置信息。
- 你这个索引段是怎么查找的?
- 额。。。。。不太清楚,我想应该是二分。
- 二分法怎么查找地址段?你不是说查找的是地址段嘛?不是一个确切的ip地址诶。
- 额。。。。。我想一下。。。。应该取折中的确切ip地址?
- 那么会这有两个问题,第一个问题是地址段是怎么进行索引的,或者说地址段是怎么进行排序的?
- 还是和查找方法法一样?取折中的ip地址,在进行排序。
- (面试官:ip地址不是字符串嘛?)答:可以先转换成一个确切的数,就是比如说1.1.1.1,可以通过1 * 256 ^ 0 + 1 * 256 ^ 1 + 1 * 256 ^ 2 + 1 * 256 ^ 3,这样子转换,再对转换后的数进行排序。
- 这个数是什么类型的数?他会有多大?(忘了问的啥。。突然说如果数过大会涉及大数排序,0A0又是啥555)
- 我想先设成long long吧,怕设成int会超(现在想想确实,应该设置成unsigned int32)。有多大啊。。。255255255*255?
- 有了解过ipv4地址的格式嘛?
- 点分。。。(说道这里卡住了突然不知道是几进制了,可能被前面的问题问晕了,面试才进行了15分钟啊555)十进制吧好像。
- ipv4,C语言是怎么存储的,用的什么样的数据结构?
- 额。。。。。我没了解过。
- (面试官:能想一想嘛)我想想啊,我能想到两种,一种是我之前说的直接转换成一个确切的数,另一种是以数组形式存储,数组空间为4,存储一个八次方的数(又胡言乱语了,当时在想256是2的几次方emmm,面试官小声bb:8次方是什么鬼),(急忙补充)2的八次方的数,也就是4个空间大小的八位存储。比如说1.1.1.1,我们可以直接存到数组中。
- (面试官:这个想法是合理的。)
- 那么你说的数组,这个大小是多大呢?
- (我直接大脑高速运转知识宇宙.jpg)额。。。。(一七得七二七四十八三八妇女节五一劳动节(bushi))应该是四个字节。
- 那这种数据结构怎样进行索引排序呢?
- 额。。。。。。这个不是很好排序吧。。。。。
- (面试官:不好排序?为什么不好排序啊?)哦哦,可以排序,我们可以遍历下标定位他们的位置,比如说先确定下标为零的数组确定他们的位置,再在下标为0相同的数组确定下标为2的数的位置,以此类推(当时忘记说什么了,反正说的有点乱,好像说成查找方法了,寄。。。)
- (面试官:有没有更好的方法?)二分?
- (面试官:二分是查找方法?有没有更好的排序方法?)额。。。我不知道了。
- 那你说一下常用的排序方法?这些排序方法关注两个数的什么关系?(--???)
- 有冒泡、插入、归并、堆排、快排等等,(后面已经语无伦次了)冒泡就是两个相邻的数相比较,每一轮排序最后确定一个数的确切位置;插入也是相邻两个数比较大小(卡壳了,说的不全);归并有点像二分的思想,把一个问题拆分成两个子问题,最后拆分成两个数比大小,然后将子问题解决完这个问题就解决了;快排也是二分思想,每次会取一个基准数,我们这里就三点取中吧,然后基于这个基准数划分为左边比基准数小右边比基准数大的部分,再对这两个部分进行排序。
- 那么回到刚才的问题(听我说。。。已经麻了)你觉得排序用哪个排序比较好?
- 额。。。我想下啊,我想用快排?
- 快排具体怎么将ip排序呢,假如是确切的IPv4地址。
- 和刚刚我说的思路差不多。
- 两个ip怎么比较?
- (怎么又回到之前的问题了--!)回答和之前的差不多。(面试官:如果是ip段呢?)可以取折中的ip地址。(忘记我怎么说了。。。)
- 你怎么找到折中的ip?用什么方法?
- emmmmm。。。(大脑已经死机了)我们说一个最朴素的吧,就直接从起始地址开始遍历,遍历到结束地址,之后找到他中间的地址。
- (面试官具体呢?用什么遍历?)emmmmm。。。可以定义一个快慢指针。
- (面试官:快慢指针?不是遍历链表的方法嘛?)我觉得这里也适用,你先听我说,一个走一步,一个走两步,快指针走到结束地址,满指针的地址就是折中的地址。
- (面试官:那他ipv4不是有四个段嘛?那你怎么走呢?)可以在下标为0的地址累加1,逢255进一。(又问了一些细节。。不写了麻了)
- 好的,第一个问题问完了,第二个问题是,你找的这个ip地址可以代表这个ip区间嘛?什么情况下不能代表这个ip区间?
- 额。。。。。。。不知道。(红豆泥私密马赛)(面试官:假设我的段有重叠怎么办?)额。。。。确实没考虑到。(那你现在考虑一下呢?)可以根据起始ip进行排序,如果起始ip一样的,保守一点的话就根据结束ip进行排序,或者说可以随便排序。
- 那如果不是重叠关系,是包含关系呢?怎么处理?
- 额。。。。。。(听我说。。)不太了解,我想可以用树状结构,用线段树?(开始给自己挖坑)
- 线段树?你知道线段树是怎样的结构嘛?
- (只了解过一次线段树。。太菜了我- -,如果有说错的地方麻烦大佬们指出)线段树就是,每个节点的值为起始值和终止值,是一段区间,然后根节点区间和其子树所有节点的区间和是包含关系。
- 那这个结构怎么解决重叠问题,又是怎么解决排序问题的呢?
- 忘记当时说的啥了。。。反正在胡说八道就对了。(省略一堆与面试官的对话和我的疯狂的私密马赛)
- 面试官:其实重叠情况是要进行数据清理的,因为一个ip并不能表示两个地理位置(原来是现实逻辑问题,听我说。。。),但是这个数据清理可能不能完全清理掉,要看你的数据的情况。我问问你,这个清理给你做,你应该怎么清理呢?— — 答:私密马赛,我不会。
- 面试官:假设没有重叠,那ip段怎么排序?(这不是回到之前的问题了吗?直接说和之前的想法一样。)
- 手撕分割IPV4,返回数组。(因为时间不够了,本来还想叫我写快排,就只让我撕这个。)
- 讨论了一下IPv4输入数据格式,返回数组的数据格式,然后开撕。(终于有个正常问题了555)
反问
- 我的表现怎样?
- 这个好像是不能说的吧,如果通过的话会通知你的。
- 我还以为一面问的是基础问题呢
- 答:这个也是基础问题啊。(--,是我太菜555)
- 是指定部门面还是不分部门统一面试?
- 网申的时候是指定部门嘛,没有指定就是不分部门统一面试。
- 多久能出结果呢?
- 我不清楚具体什么情况哦。
最后的话
还以为一面是常规八股没想到会挖这么深入(感觉就是对需求的深入探讨吧),面试官还是挺好的,一直在引导我回答问题,感谢和面试官就我实习经历做的需求展开深入探讨,就是感觉好多答不出啊只能私密马赛qaq,如果不是面试的话,我觉得我们聊的还是挺愉快的哈哈哈。最后希望一面能过吧,许愿offer。
背分布式理论和Raft和Consul有点去了。。。
#学生时代让我难忘的事##深信服校招##深信服##面经##23届秋招笔面经#