字节 - 基础架构团队 - KV组 - 一面

1. 自我介绍(实习,开源,项目)

2. 流程通过后什么时候可以到岗?能实习多久?可以接受base调整吗

3. 介绍一下arana-db/kiwi这个开源项目

4. 你参与这个项目都做了些什么

5. 你个人的这个分布式kv存储项目是出于兴趣做的对吧

6. 行,那我们聊聊你这个项目,你简单介绍下项目大概是个什么架构,支持了什么能力?(详细的讲了从存储层,db层,网络层,分布式四个方面分别说了设计实现和优化,大概单方面输出了十多分钟)

7. ok,实现的东西还挺多的,我们一点一点聊聊,你刚才有提到异步写入对吧,如果某个时候流量非常大,内存写到channel非常快,但是channel到磁盘I/O很慢,这时候两端的写速度不匹配你会怎么处理?(在channel前添加一个容量大于channel的buffer缓冲区域,把写请求速度不一致的时机从channel两端延迟到buffer进channel时,在buffer部分实现速率调控,保证两端速度一致,但其实这里还是会有一个问题,突然宕掉的话buffer会丢失;大概就是在buffer出口加个pipeline之类的,面的时候没想起来,就没详细说这里的处理)

8. 那你有想到解决数据丢失的办法吗?(刚开始想WAL,但是如果WAL其实和直接写盘没什么区别了)

9. 行,你这里还用了布隆过滤器对吧,Bitcask不是一个全内存索引吗,为什么还要布隆过滤器?(刚开始听错问题了,说了一遍Bitcask的整体结构,然后面试官引导才发现听错问题了,然后讨论发现是我想错了,不需要布隆过滤器的效果是一样的)

10. 行,没事,那我们接着聊,bitcask刚才提到他是一个纯内存索引结构对吧,你想想这个场景,这里如果我机器的内存很小,存不下所有的索引,你应该怎么处理,有想过吗?(参照操作系统中虚拟存储器的概念,只加载一部分索引到内存中,剩余的放在一个单独的索引log中,如果当前内存中没有的话就置换索引log中的下一块内容到内存(这里铸币了,说如果log中也没有索引会有额外的I/O开销))

11. 这里不就可以用到刚才说的布隆过滤器吗,查之前筛一下。(懂了)

12. 你看过pika对吧,那rocksdb了解吗(说只了解一点lsm tree的内容,没仔细看过)

13. 行,那对于Bitcask你觉得他有什么优劣势?(从实例结构,日志结构,追加写顺序读,内存索引,merge分别讲了一下)

14. 行,我看你db层实现了redis相关的数据结构,你这里用的时候需要把磁盘里的所有内容都拉到内存中吗(以List为例讲了一下,LPush之类的是需要加载全量数据的)

15. 行,你看过pika怎么做这个事情的吗?(没仔细看过,讲了一下pika把不同数据结构分别存在不同块中(在存储层将rocksdb存储划分为不同区域存放不同内容))

16. 行,我看你分布式实现用了raft,读过raft论文吗?讲一讲(从Leader选举,日志复制,安全性问题(随机定时器破坏公平条件之类的)分别讲了一下,然后日志复制讲了点状态机还有从日志到实际数据落实的过程)

17. (开始少量八股)ok,大致没有问题,我们聊点别的,我看你主要是golang对吧,那问你个go的问题吧,GMP的G为什么一定要挂在P上,而不能直接挂在M上?

18. 操作系统中进程比线程开销大主要大在什么地方?

19. ok,那我们做个题吧。(ez,一个数组满足先递增后递减的特性,找到最大值(二分))

20. 反问:

1. 有哪些您觉得需要提升的地方?

2. 后面还有几轮面试?(1-2轮)

3. 组里主要做什么的?(kv)

---

一共1个小时左右,十分钟后秒约二面

#面经#
全部评论
必拿下
点赞 回复 分享
发布于 04-03 20:39 北京
大神
点赞 回复 分享
发布于 04-03 20:52 广东
👻了
点赞 回复 分享
发布于 04-04 10:40 湖南
好厉害
点赞 回复 分享
发布于 昨天 16:32 北京

相关推荐

评论
7
7
分享

创作者周榜

更多
牛客网
牛客企业服务