> 因为我本人目前不是做Golang方面的工作,所以问的Golang方面的问题不是特别多,细节的问题也不多,而且面试的很多问题都会结合个人的情况,所以以下内容仅供大家扩展眼界,查缺补漏
### Golang基础
1. Golang 中sync包下的内容,使用过哪些内容。
2. 设计模式中的单例模式,在Golang中有哪些实现的方式
3. Golang中的锁,有哪些,基本的API如何使用
4. 一个锁,如果没有调用lock()方法,就直接调用unlock(),会发生什么。
5. Golang的协程与传统的线程,有哪些优势,好处在哪里,能不能简述一下。
6. G P M 的问题,就是协程的调度那块内容。
### 框架上
因为我目前的工作没有使用关系型数据库(mysql),所以当问到这块的时候,都被我推掉了,这块的内容也很重要!
#### Redis相关
我简历写了Redis比较熟悉,所以问的比较多。
1. Redis的5中数据结构
2. Redis自实现了哪些数据结构
3. Redis作为一个单线程的框架,为什么比较快。
4. Redis 主从模式是否了解,主从之间如何做数据同步的
5. Redis 主从模式的工作原理
6. Redis 访问数据,连接的机器不处理这个Slot,访问的话会怎么样。
7. 如何保证两个key,Slot不一样,但是还可以放在一个机器里面
8. Redis的事务不具备回滚的能力,如何做到可以回滚。
9. Redis的list可以从首尾取元素,那么Redis可不可以按照范围取数据,有什么要求。
#### Kafka 、 MQ一类
我目前工作MQ一类作为消息的处理方,所以对MQ的内容熟悉度有限,问的不是很深,欢迎各位在补充
1. Kafka offset相关的内容,具体的问题我不太记得了。
2. Kafka消息重复的这种情况,如何处理
3. broker的概念内容。
#### GC相关
我简历写了对GC比较熟悉,所以这块问的比较多,不过可能GC实际操作的内容比较少,所以偏理论的问题。
1. Golang的GC是什么样的
2. Golang的对象,什么时候,GC才会参与处理数据(逃逸对象问题)
3. GC的工作模式,优劣。
4. Golang的GC是否可以进行调优,如何分析,处理
5. Golang与其他语言GC相比,区别联系(Java GC),这个问题谈的比较开放,就是聊一下GC的内容,跟语言无关,看你的知识面能聊多少了。
#### 分布式事务
我公司有个分布式事务的监控框架,可以提供一些事务上的补偿,所以问了这个。
1. 分布式事务原理上的问题(CAP,BASE,ACID)
2. 我们公司的分布式事务管控,框架提供的能力。
#### 多级缓存
同样是公司有这个框架的能力,就需要介绍一下使用的问题等等。
1. 为什么要有多级缓存框架。
2. 缓存穿透和缓存雪崩的区别,你们的处理方式
3. 本地缓存的同步问题。
#### 调度计算服务
业务自己基于Redis,根据自己的业务特点,写了一个调度分发和计算服务的内容。
这里不能谈太多了,因为涉及业务细节,跟自己公司的业务匹配度比较高,不具备通用性。
大部分大数据的处理模式,我了解的还是基于MQ处理的,通过MQ削峰,然后由于Kafka一类的MQ会有消息重复的问题,尽量保证消费端幂等,消息如何保证不丢失,处理失败是否需要回滚等等,这个公司如果有这种服务的话学习起来就比较快了,如果没有的话,可能就理解的不是很透彻了,我在这也不写具体的题目了,我见过的也有限,欢迎大家加入讨论。
#### Serverless
这块我曾经有使用过,问过做的一些内容,很多人可能都不太了解什么是Serverless,所以欢迎大家把这个作为一个扩展阅读。题目我就不给了,很多面试官对这个概念都只是听过,也没问什么比较有价值的问题。
### 基础内容 & 算法题(手写)
我目前服务器的环境是Windows环境(因为我是做C#/.NET)的,所以问了Linux常用的一些东西,我也推掉了,这块有必要补充学习一下。
1. GoF设计模式,说一些比较熟悉的,4种以上。
2. 上面我提到了观察者模式,然后面试官让我手写一个简单的观察者模式,不限制语言,比较崩溃,写的磕磕绊绊,但是勉强思路还是没问题的,以后少给自己挖坑。
3. 给定一个数字的字符串,列出所有可能的IPV4 地址,例如“123456”,那12.34.5.6就是符合的一个结果。123.4.5.6也是。
4. 给一个数组,给出他的中位数。
5. 给一个单链表,一个from,一个to,把链表from-to的内容反转,比如说1-2-3-4-5-6,from=1 ,to = 3 那结果是1-4-3-2-5-6。
6. 写一个二分查找的代码
7. 给一个数组,一个目标数,列出所有两个数字和为目标数的所有结果。例如数组:[1,2,3,4,5,6,7], tag = 5, 那结果是[[1,4],[2,3]]。尽量优化时间复杂度和空间复杂度。
#### 系统设计
有几个系统设计的问题跟公司用的系统息息相关,通用性不强,我给出一个我认为通用性强的:
1. 例如抖音有一个功能,如果一个视频的评论里面,有你关注的人给了评论,那么就会把这些评论,置顶,之后再按照评论的热度依次向下。这种情况下如何设计业务和缓存,保证可以实现这个效果。(PS. 视频千千万,每个评论也可能有几十万,所以不可能每次都直接查询,肯定是要设计缓存的,重点考虑一下缓存的设计和存储的设计。)
2. 列举一下你公司的系统上的设计,或者你认为比较有价值的设计。
### 后记
里面我没有附加答案,因为很多问题,面试回答可能会比较片面,有的问题也没有标准答案,我回头慢慢往里面补充一些这方面的内容。
之前一直有人说面试看缘分,我不太懂。最近面试我理解了,每个人都服务于自己熟悉的业务内容,每个业务体系都有熟悉的框架和使用模式,所以你很难跟对方完全对上思路,技术内容也很难完全匹配。
特别是系统设计上,很多人都爱用自己公司的设计问题,特别是一些设计难点,来问你,看你临时发挥到什么程度,这种问题就只能看你对微服务设计上的很多细节内容了,我觉得没有办法万法归一,需要多看多积累,很多目前的书都会有介绍,大家可以多读读。
### 学习资料推荐
- 框架的官网是最好的资料,没有比原作者更熟悉他们的内容的了,如果你英语不错,我就强烈建议先刷一遍官网,再看别的比较深入的博客内容。
- 我看过的觉得不错的书:
- 《Redis设计与实现》
- 《深入分布式缓存:从原理到实践》
- 《分布式服务架构:原理、设计与实战》
- 《深入浅出Serverless(技术原理与应用实践)》
- 《剑指Offer》
- 《深入理解ElasticSearch》
- 这本书是翻译的,很多翻译有点不太准确,不过整体内容还是很棒的
- 《MySQL技术内幕:InnoDB存储引擎(第2版)》