12月21日 蓝湖一面
面试体验:可以说是我的第一次面试,面试官一直在引导我,听录音发现自己说话磕磕盼盼的,问那个缓存一致性问题,我感觉就像被逼入死角的杰瑞,不知道说什么.最后的算法题,面试官提示我是二分,没做出来.
技术不足:无法把自己的项目说清楚
- 自我介绍
- 挑一个你最有价值的项目讲一下,展开讲一下,有几个模块
- 你实现的状态机解决了一个什么问题(这里我没有说清楚,讲了状态机记录请求index去重,这是非常次要的功能了,可以讲线性一致性,ReadIndex,randomRead,syncRead,存储引擎,快照)
- 请求后发先至问题,会不会导致前一个请求被屏蔽(在我的实现中一个客户端一次只能请求一次,或者说是上一个请求有回复了才能执行下一个)
- 怎么解决这个问题(这时候我已经乱了,说了个对请求排序,然后扯吧扯吧,/(ㄒoㄒ)/~~,应该说不能够同时发,或者用建立个client去发)
- raft共识层是怎么做的呢?(主从选举,日志复制....)
- 如果中间有节点更新错误了呢?(拜占庭问题??这里我反问了一句什么样的错误,面试官想说的是节点写入内存或者写入硬盘失败了,我没有想过这个问题,在我认知中错误只有节点失联,关机,如果出现写入不成功,只能不断的重试,这时候状态机的锁会被一直占用,raft还能运行但是状态机凝固)
- 重启后节点数据消失怎么解决.(raft持久化....)
- 机房断电了,多个节点关机,多个节点数据不一致,主节点应该怎么处理?(节点重启,根据之前持久化的信息恢复)
- 使用了存储引擎是什么?(Go map)
- map是怎么实现的kv映射?
- key是如何被映射到这些桶的?(计算hash值,根据 哈希后B个位 定位哈希槽,比较tophash)
- 数据量很大,溢出桶很多,定位时间很长,怎么解决?(这里我以为要换存储引擎,其实面试官想问扩容机制)
- 扩容机制
- 讲一下JWT令牌登录(这里我答得更乱了,cookie是客户端技术 ,session是服务端技术,token是可存在cookie中的也可存在body中,如果你要实现一些特殊功能,如黑名单,私密数据需要存在redis中,每一次访问,都要检测比照一次)
- 黑名单,私密数据实在什么时候被写入到redis中的?
- mysql中的私密数据被修改,redis中的数据变成了脏数据(缓存一致性问题,我回答,在修改私密数据的同时,修改redis中的缓存)
- 做业务和做框架的不是同一个人,写业务的人不知道去修改缓存,如何去解耦呢?(不知道怎么弄,缓存一致性问题不会)
- struct和interface讲一下区别
- 函数的入参定义成struct和定义成interface的区别
- 空struct和空interface的区别和应用场景(空结构体更多的利用无大小的特点,例如 channel 不需要知道消息是什么,只需要知道有消息来了,例如map实现set,只要key不需要val, 空接口更多的是承载,go1.18之前没有泛型,很多函数的参数类型是interface{},在函数内部去类型转换)
- defer的用法?( 先把返回值复制到returnPointer 在按照栈的顺序执行defer的内容 )
- defer中对返回值修改,在函数外能拿到这个修改吗?(1.有名返回值 2.引用类型或指针 )
- 算法题
问题 1.所有数字出现两次,一个数字出现一次(位运算,全部异或)
问题2 所有数字出现两次,两个数字出现一次(位运算,全部异或,得到一个p,用这个p的任意一位1 去与运算 按照01分为两组 每组再去异或)问题
问题3 所有数字出现三次,三个数字出现一次(哈希map计数)位运算
问题4 哈希计数的区别,两者的优缺点
算法题 一个无规则数组,找到其中的极小数,指比相邻的数小,两端的数可以是极小数(方法一 遍历 方法二 二分,当一个数比右边的数大于或等于,那么这个数的右边的一定有极小值)
反问环节:
1.能给一些学习的建议吗? (多考虑一些实际的东西,第二道算法题没做出来,催得紧,感觉挂了,不想反问了)
#你的秋招进展怎么样了##我的求职思考##golang面经#