字节二面(110+min 高质量面试)
说实话,这次面的问题真的很难,很多问题我都是要提醒一下才能回答上来,场景题很多、还有用场景结合八股的
有点措不及防,答的稀烂 但过了我是不太理解的 ,可能发面经真的有用,来还愿了(已约三面)
1、自我介绍
2、介绍一下做的比较好的项目(这里我介绍了RPC,被问题狂烂轰炸)
RPC项目的问题
2.1 问我RPC中的线程模型,比如说主线程、工作线程,这些我是怎么设计的(一个线程池用于IO多路复用监听连接(netty自带),一个线程池用于处理连接的事件循环(netty自带)) .. 这里忘了说设置了一个特定的线程池处理请求的实际逻辑,妈的寄了
2.2 又扯到了线程池的参数设置(常规八股)
2.3 我看你单机多实例的TPS反而比单机单实例的还低,有思考过为什么吗?(我觉得是因为单机的性能有限制,单实例就已经打满了,再多实例就会多出额外的没必要的开销)
2.4 你说单实例被打满,那再按照你的设计细分一下被打满的场景(如何被打满?),在这些场景下的线程池又要分别如何设置(我听不懂题目,他提醒我,从请求的处理逻辑过于简单和过于复杂两方面进行考虑)
2.5 为什么采用RPC,而不是采用HTTP(常规八股,可能面试官在想其他问题 丢我一个八股)
2.6 我看你使用了nacos作为服务注册中心,那么使用nacos有什么好处呢?(我说我没了解太多,只是用来当注册中心的,所以换了个问题,哈哈 其实只是nacos因为能给定服务实例权重,方便我实现随机权重算法哈哈哈哈哈)
2.7 你使用的负载均衡算法(随机权重、一致性哈希),是在哪里负载均衡的(客户端还是服务端)?
2.8 随机权重算法的使用场景(我答了有权重)、一致性哈希的使用场景(答了高可用,防止请求打不到实例上;哎我这里的理解有错,应该是防止请求打到不同实例上)
2.9 那么有权重的场景都使用随机权重,其他场景都使用一致性哈希吗?随机权重就会出现请求打不到实例上的问题吗?(我觉得是不会的)
2.10 那么我给定你一个场景,各个实例的状态都是相同的(也就是说他们的负载能力、剩余内存大小都是相同的、打在不同实例上的结果也是相同的,他们之间没有任何区别),那么你还会接着使用一致性哈希算法吗?(这个问题其实我当时有点懵,实例的状态相同和我一致性哈希有什么关系,我是为了高可用性啊;最后他说不是什么场景都能用一致性哈希的... 我就顺带回答一句 确实 计算哈希的开销会比随机权重更大)
复盘之后发现,是我对于一致性哈希的使用场景理解不到位...所以导致我对面试官的问题都理解得不清晰
2.10 随机权重算法具体如何实现?
2.11 如果带权重的话,要如何实现一致性哈希?
(我这里真的答得烂透了...没有实际地区分它们各自的适用场景)
复盘时仔细总结了一下它们各自的使用场景
这里需要实际清楚一致性哈希的使用场景,是为了保证信息相同的请求能够尽量地打到同一个实例上(因为如果请求在实例中保存数据,那实例的不同就会造成取不到这些数据导致错误,这时候就需要数据迁移)(这里没有考虑服务实例之间的数据一致性,有可能它们会进行数据同步也不一定),在集群扩容缩容时,一致性哈希可以减少数据的迁移量,只有一部分的请求会打到不同的实例上。所以一致性哈希适用于需要使用节点存储数据(打到不同实例上会出现不同结果)、并且节点个数会动态变化的场景。
而随机权重算法的使用场景,则适用于不同的服务实例具有不同的负载能力、处理优先级的场景,每个服务实例具有不同的权重(在默认权重下就退化成朴素的随机算法了),请求打在权重较高的实例上的概率会更高。但是随机权重算法没有考虑到数据的迁移问题,所以应该适用于 不需要使用节点存储数据,打在哪个实例上都没有区别 得到的结果都是相同的,但是需要考虑各个实例具有不同负载能力的场景。
学生论坛项目的问题
2.12 我看你的另一个项目 学生论坛,里面有说到两个定时任务(1、定期批量地将点赞关注数据持久化到mysql中;2、定期刷新帖子的热度,并刷新热帖排行),那么为什么这两个任务要定期呢?批量又是怎么个批量法呢?(常规)
2.13 你的帖子内容,具体是如何存放的呢?是直接用mysql存的吗?(提到了使用es,倒排索引,对比mysql的优势)
接下来就有点高潮了,直接在这个基础上加了场景题(可能因为我提到了es,借它之手来问我,实际上与es毫无关系)
场景题:
1、那就说说es,在使用es的场景下,如果帖子存的太多了,那是不是会导致它的性能下降,这时候你会怎么办?(搭集群)
2、在搭集群的场景下,如果你想要用es通过前缀查询,查询到热度为top10或者top100的帖子,这里不考虑es实际的底层原理(因为他也不懂),就让你想一想要怎么实现?(这里我以为是问是集群是怎么运作的,答了主从架构,在从节点中各自取top100,再交给主节点进行排序,再取出最终的top100)
3、在单机的场景下,你es节点要通过前缀查询,查询到热度top100的帖子,这种算法你会如何设计?会考虑使用什么数据结构?这里要求响应要很快(原本我还以为要考虑字符串匹配的算法、然后再考虑排序的算法;没答上来,他提醒了trie树,但我觉得这种做法会OOM,然后他叫我不考虑内存,在集群架构下可以分摊给别的节点,哎我果然是刷题思维,跟他们这种工作多年相比本质上真的有区别)
4、接着上面那一题,如果使用trie树,在一个帖子被点赞、访问时(也就是它的热度更新时),你会如何维护这个trie树?时间复杂度为多少?
3、计网
3.1 给定你一个场景,发送端和接收端建立了TCP连接,正在传输数据,如果此时接收端进程宕机了(是进程宕机哦),而发送端并不知道,这时候会发生什么样的事情?(一开始回答了保活机制,但被面试官提醒了;然后又回答没有ack 导致发送端阻塞 超时重传;经过提醒才知道原来tcp是由操作系统的协议栈控制的,只要主机没宕掉就仍然会ack...接下来你们自己想咯?)(不过我在看小林coding的时候说 进程崩溃时,内核会自动回收它的资源,所以socket也会被回收,并且发送四次挥手断开连接.. 不知道是面试官错了还是小林错了)
场景题又来喽
场景题
1、如果你要基于TCP协议,传输一个大文件,传输的过程中很有可能出现错误 比如说宕机什么的,现在要你设计一个协议去保证这个大文件的传输,那么这个协议你要如何设计,简单的讲一讲?(很经典的一个大文件上传、断点续传)
2、那么发送端要如何知道还有哪些文件段还没发呢?(暗示我的协议缺陷,没有给确认号,但给了不就是类似滑动窗口了?爷不想用滑动窗口,所以还在想别的办法,但他就是想把我拉到滑动窗口)
3、说我想得太复杂了,这不就很类似于滑动窗口吗?(我就是不想用滑动窗口啊!)
4、说一下滑动窗口的执行流程(这才是你的最终目标吧面试官?)
4、Mysql
4.1 了解事务的特性吗(常规八股)
4.2 你刚才说到了原子性、一致性、隔离性,能具体说明一下是怎么一回事吗?举一下实际的例子(转账例子用一辈子)
4.3 刚才说到了隔离性,你知道mysql的最高隔离级别是如何实现的吗?(常规八股)
场景题(结合了操作系统)
1、如果要你来实现mysql的最高隔离级别,你会如何实现呢?具体说一下场景、具体的语句,要分别如何加锁,加什么锁?(仍然用转账来说明,A给B转账,B给A转账)
2、你觉得你刚才说的这种场景会发生死锁问题吗?具体会发生在哪里呢?(转账是有流程的,先当前读自己账户余额,再当前读对方用户余额,再更改账户余额,具体死锁在哪你们自己想)
3、要如何解决这种死锁的情况,在代码中要如何编写?(其实我觉得如果根据mysql的锁机制就一定会死锁,不管顺序如何,只要同时转账就会死锁;最后他让我不考虑mysql的锁机制,只考虑普通的锁,那就是操作系统的经典场景)
这里是我当时对场景没有思考得太清楚,同时开启转账事务的时候,如果当前读加的是读锁,则死锁会发生在更改余额那里;如果当前读加的是写锁,则读的时候就会发生死锁了,本质上还是操作系统的经典死锁问题,(我太笨比了)
5、操作系统
5.1 逻辑地址、虚拟地址、物理地址、线性地址,他们之间分别有什么区别?它们之间是如何转化的?(说实话逻辑地址这个概念实在太模糊了)
应该是没有了,记不起来了,忘了录音
6、算法题
1、检测循环依赖(其实很简单,但没复习拓扑排序,换了道题)
2、将一棵二叉树根据中序遍历的顺序,转化为一个双向链表(左指针 = 链表的前向指针;右指针 = 链表的后向指针)
7、反问环节
#实习面试初体验##你的秋招进展怎么样了#