金山在线文档事业部基础服务后端一面
- 上来先介绍一面的主要环节,包括候选人自我介绍(针对项目经历,项目难点,个人专业技能可着重介绍),基础理论知识考察,反问环节
- 为什么要离职?
- 我们知道linux操作系统里头有锁的概念,你能说说常见的锁有哪些类型
- 你刚刚提到的自旋锁,那你知道golang里头有哪些实现方式吗
- 了解锁的可重入/不可重入吗,能解释一下“重入”这个比较基础的概念吗?sync.Mutex是可重入的吗
- 假设业务场景需要自行实现一个可重入的自旋锁,应该怎么做?
- 自旋锁还有一个问题,如何保证公平性?有考虑这个问题吗?
- 这种上锁的机制其实在操作系统里头是属于同步的一种模式,你还了解哪些同步机制吗
- 有没有了解过Linux的RCU机制(read-copy-update),是比较常用的一种同步手段
- 有没有了解另一个也比较常用的机制(copy-on-write),也是我们这边实际业务场景会用到的
- 既然你刚刚提到了WAL机制,那你能说说追加写和原地写的差别吗
- 有没有了解哪些组件的设计是采用追加写方式的?它有什么好处呢
- 有没有了解哪些KV数据库是采用追加写方式的?
- 追加写会存在什么问题吗?该如何解决?
- 围绕你刚提到的AOF重写机制,假设现在开了子进程在重写过程中,父进程也在执行写操作,那这个时候写性能不就会降低了,该如何处理?
- 平时项目中服务端之间一般都如何通信的?(http接口,grpc接口,消息队列解耦...)
- 讲讲http的队头阻塞
- 你知道http2.0里头的多路复用原理是如何实现吗?
- 了解过它里头设计的数据结构吗,怎么去拆分报文,怎么去压缩头部?
- grpc是基于什么协议,问的通信协议而不是编码序列化协议?
- 有没有了解过grpc里头是怎么去做服务注册,服务发现和负载均衡?
- 你们现在是微服务架构吗?假设现在A服务要请求B服务,B是一个非常多个pod部署的多节点(副本)服务,这里头是怎么实现负载均衡?
- 一般其实是会在客户端做的负载均衡,你有了解过grpc是怎么做的吗?
- 再聊聊你刚提到的一致性哈希吧(有状态服务纵向分治场景下会常用的)
- 一致性哈希怎么解决负载问题的?
- 实际有可能出现某一些节点处理的请求处理的数据量更大,那么这个server节点的负载就更高,我想避免这种情况,该怎么做呢
- 假设现在有A,B,C 三个server,我不知道哪个负载更高,让你来设计动态适配的负载均衡,你会怎么做
- golang里头的WithValueContext,这个是并发安全的吗?
- 我们经常会通过context去控制上下游超时,基于当前context再去生成子context,那么父context取消时,是通过什么机制去控制子context的取消?
- 你有没有了解过MySQL的buffer pool,它是怎么做内存管理的?
- 那么它是怎么去刷盘的?
- 反问(主要编程语言会是go, C++, Cgo)
2023.12.11 二面
上来直接开始问问题了,没有任何开场白和自我介绍环节了,猝不及防,够硬核...
- 你对树和图这2种数据结构了解多吗?怎么分别去描述它们
- 为什么树要设置出这么多的类型,它们分别是为了解决什么问题呢
- 刚提到平衡二叉查找树,为什么它要是平衡的呢?
- 如果不平衡,那么它的遍历顺序是怎么样的(前序,中序,后序)
- 不管是什么树,在内存中都会用到指针关联父子节点,那当这个东西要面向磁盘去做存储的时候,我们就要把这些所谓的指针关系做序列化,如果是由你来设计,你会怎么做?
- 简化一下,假设给你一个二叉树,你要怎么把它持久化存储到磁盘中,以及查询时怎么把它捞出来?(提示:可以参考JSON序列化过程)
- 树和图在搜索元素的过程中有哪些方法?
- 可以展开讲讲BFS/DFS分别是怎么做的?
- 遍历过程中如何去避免重复访问同个节点?
- 这个map/set里头的key是什么呢,怎么去描述一个节点?
- 你认为BFS/DFS各自适应于哪些场景呢,有没有在工作中用到它们来解决一下实际的问题?
- 假设在一个图中,想要找到一个点到另一个点最近的距离,你觉得应该用什么方法?
- 聊聊项目,在做一些OpenAPI的时候,你的接口是如何设计的,会有什么规范呢?
- 有用过其它大公司例如Google/Amazon/Miscrosoft开放的接口吗?了解过它们是怎么设计的吗?
- 针对三方提供的webhook,一般在调用他们的过程中可能会面临一些问题(请求返回失败,响应超时...),通常是要做重试的,这方面你是怎么设计的?
- 失败补偿的这条记录是什么时候落表的呢?
- 有没有可能请求失败了,然后也没有成功把记录写入表中呢,可能中间程序就崩溃了?这种情况怎么保证这条消息还能重推呢?
- 讲讲最近的这个促销活动预算池项目吧
- 最后问一道系统设计题:
平时我们用的一些类似微博、知乎平台,有一些热搜的系统,会有很多的话题,
每个话题根据用户的行为会有不同的热度,然后会对他们进行从高到低的排序,也就形成了所谓的热搜榜。
假如让你来实现这个功能,你会怎么做呢?
- 再补充一个业务场景:假设存在某个历史的话题,它的热度非常高,后面的话题热度都没法超过它,那么他是不是永远就停留在这里了,你会怎么去实现一个随着时间推移,前面的话题影响力下降的效果呢
- 反问
之前的团队只有一个HC,且需要尽快到岗,由于我的一二面间隔比较久,有个同学流程进程比较快,已经走完了流程并且打算签约了,但是HR打电话联系说基于前2轮的面评还可以,被另一个做AIGC的团队捞起来了,同样在金山办公这个大部门底下,算法工程团队有新的HC,问我有没有兴趣,部门负责人说可以加面2轮
2023.12.21 金山办公研发中台三面
- 自我介绍
- 面试官给我也介绍他们那边正在做的事,有哪几个模块
- 挑一个印象最深刻的项目详细讲讲(中间提问了一些细节问题)
- 这里头所有的sender和receiver都在同一个errGroup的控制下吗?
- 回写DB的时候是涉及多个库插入吗?
- 假设现在业务量扩大,除了ID市场,又在其它市场也roll-out了,每天的订单量翻了好几倍,如果还要让这2个回写任务和budget实占计算任务正常工作的话, 你可能做哪些优化呢?
- 这样的做法是把整个业务系统纵向切分/扩展了,那么假设某个region的订单量异常的大呢,出现一种极端情况,24小时都跑不完,隔天你又开启一个新的T+1任务,发现前一个T+1的任务还没跑完,这时候怎么办?
- 问一个场景题:假设给你很多日志文件,大概几百个,这些文件里头有一些关键字是我感兴趣的,希望你把包含这些关键字的行都找出来,用go来实现这个事你大概会怎么写呢?
- 目前在职吗?能接受换工作地吗?
- 还有什么没提问到,但你觉得有技术含量的或者你个人掌握得比较好的点,想要再展示一下的
- 反问