Galxe - 一面 - 杭州 面经
(两个面试官前后分别面,一共一个半小时)
一、45 分钟
- 自我介绍
- 看你参与的开源项目还有个人项目,这三个你想讲哪一个?(自己的分布式KV)
- 好,详细讲讲这个项目。(从存储层开始讲,讲到异步写的时候被打断了一下)
- 你这里异步写怎么实现的?(通过 channel 延迟写入时机)
- 如果突然宕掉了怎么处理的?(这里会丢失少量数据,写的时候感觉这里是可接受的就没处理)
- 现在要你处理的话怎么做?(WAL)
- 网络层为什么使用CloudWeGo Netpoll?(IO多路复用,然后讲了自己实现和参考 Redis 的部分)
- 对 Netpoll 的零拷贝了解吗?(不会)
- 你分布式怎么做的?讲讲 Raft。(讲思路,Raft Leader 选举,数据同步)
- Raft 中 Term 起到一个什么作用?(Leader 选举正确性(防止脑裂),Leader 过期,一致性)
- MySQL 事务隔离级别,ACID,undo log, redo log
- Redis 持久化(aof, rdb, 混合)
- Seata-Go 中你优化锁键构造怎么做的?(从关键代码,修改思路,锁键形式到最终实现讲)
- 这里 cache 存列信息不会比较慢吗?(只存列 title 和元信息)
- 做题:一个给定的
CallMe
函数,会概率性的产生 error,N 个 goroutine 执行 N 次CallMe
,其中一个 goroutine 错误时中断其他所有的。(channel + select + WaitGroup,或者 ErrorGroup) - 反问: - 您觉得我有什么需要继续改进的?
- Web3 相关
二、40 分钟
(第二个面试官感觉更像聊天)
- 刚才都问了什么?
- 好的,我看你这里做了集群自动扩容,怎么实现的?(本节点 init 的时候保留一份连接信息,然后添加新 Voter,把连接信息广播出去)
- 你这里分布式数据怎么分片到别的节点并保证一致性?(目前所有节点数据是一样的,没有做分片,然后又讲了一遍数据同步)
- 你有想过这里分片 & 一致性怎么实现吗?(分发到不同的若干个节点而非集群的所有节点)
- 这里其实还是不太好实现一致性吧,Redis 上的实现了解吗?(说了点 Master,Slave)
- 对的,可以学习一下这个(然后面试官说了一下自己对 Redis 实现的理解)(大概理解了,讲了一下自己的理解,大概就是一个大集群里若干个小的集群,大集群只考虑怎么把数据分发到对应的小集群,一致性相关的事情放在小集群做)
- 对的对的,不过还是得去考虑一下分发数据的细节实现什么的。
- 然后 Redis ZSet 了解怎么实现吗?(讲了一下,然后讲了自己KV项目上ZSet的实现,从 Bitcask 数据组织方式,自己的两种思路,最后选了多 key,然后讲了目前的实现和自己项目中怎么去用 SkipList 优化,大概就是初始化/重启的时候构造 SkipList,插入/删除时WAL后维护SkipList)
- 对的 Redis 其实也是差不多的实现,然后你这里有做数据淘汰什么的吗?(TTL 和 MemCache 淘汰简单说了一下,然后说 Bitcask 保证空间利用率的方式(二进制,Merge))
- 好的,你这个项目是只做了一个月吗?(之前做过一个版本,重构用了一个月)
- 好的,你项目仓库发我一下吧,我待会看看。
- 闲聊(大概就是未来的方向,然后说对一个方向保持热情是很难得/纯粹的叭啦叭啦...)
- 公司内 Web3 和 Web2 都有,对哪个更感兴趣?(Web3)
- 反问: - 每个面试官的看法不太一样,所以还是想问问您觉得我还有什么需要改进的点?(一些我项目的改进意见,然后保持兴趣)
- 后续还有面试吗(还有一轮技术面)
结束。
语音转写不太好用,有的问题忘了(
---
2.20 update: 已约二面
#面经#