实习面试 蚂蚁OceanDB 应用开发部
蚂蚁OceanDB 应用开发部
4/25号中午面的,开始的时候面试官周末打电话给我说蚂蚁DB捞我了,之前投了几个蚂蚁的部门,随便选的一二志愿,结果都简历挂了,后来给本校学长内推,还是简历挂了,今年估计他们挺卡本科的,我本科就是个普通一本,不在目标院校内。
开始的时候介绍了下自己的实习经历,主要是干点深度学习的内容,对方不太感兴趣,之后介绍了两个项目,一个经典的cpp服务器,另一个是go项目。
他对后面的项目比较感兴趣,因为他们部门主要是做数据库应用的,估计是用的go,开始问我为什么技术选型使用gin+gorm,我说gin和gorm都挺上层的,用着比较方便,相比起flask的需要手动绑HTTP的参数相对更方便,gorm也一样,可以支持在语言中用注释的方式进行绑定。后来他还是问了问为什么这么选,比其他框架有啥优势,我想起来当时并没有涉及技术选型,是项目直接给定了技术栈,现在想想应该去补一补技术选型的内容,为什么使用该框架,对比其他有啥优势。
之后就像问我框架的内部实现,我说我也没看过,之后就过去了。
看到我项目里用到mysql,之后就开始问,项目里的表你自己设计的吧,那么如果在表中增加一个字段,应该怎么办呢,我说直接alter表结构,增加一个字段不就行了。他说不能影响正常功能的上线,我说能不能搞个AB系统,先用的老系统,之后更改后的表在新系统,新系统搞好后再逐渐分流就行,总觉得答得不太对,回来问了问同学,说是可以建立一个视图,先在那个视图上进行查询,之后更新后在新表上创建新视图,对视图这事吧我也不太清楚,需要回去复习下。
后来还看到我会redis,就开始问了点redis和mysql的同步问题,开始时说如果用户写数据,那咋办,我说先更新redis,之后根据一定的阈值来异步回写数据库,比如说每隔三秒发生了十次更改就回写mysql数据库,之后他说如果redis宕机了咋办,我说redis有主从模式,如果主节点宕机了从节点可以通过选举机制来成为主节点从而保证可靠性。后来说如果暂时不考虑主从节点呢,我说如果是要求可靠性比较高那你也可以考虑先写数据库再写缓存,他说如果中间写redis的事件丢了呢,我说可以通过数据库的事务一致性来保证写事件必须发生,把写数据库和写redis合并成一个事务,如果错误触发回滚机制。他说也可以吧,回头来想事务一致性可以保证写redis这个事件吗,记得只能写数据库的数据对应操作吧,他还能把写redis也封装成一个事务吗。后来回去查了查,发现可以通过消息队列来保证消息被redis消费,如果当时redis因为意外没能消费,消息队列里的消息就依然存在等待下次被消费,还有一种方法好像是让redis关联mysql的binlog,之后消费binlog里产生的消息即可。
后来我也记不太行了,下次的复盘还是得立刻复盘,否则容易忘。
之后说我笔试没有做,让我拿电脑现场做一下,我说没收到技术的笔试啊,我做了性格测试这类的测评,他说笔试当时可能已经结束了,我说附近没电脑,那电脑的话得十分钟,他说算了,口述算法题吧,开始出了个括号匹配,有大中小三种括号,判断他们是否合法,我说用栈吧,之后详细叙述了下,后来他说如果换成只有小括号呢,空间复杂度能不能优化一下,我说用两个计数器,保证前缀中左括号数量永远大于等于右括号,否则直接return false,最后return l_cnt == r_cnt。后来他说用多线程优化一下吧,我开始没想好,说可以把括号拆成n段,每一段判断l_cnt >= r_cnt这种方法,这种方式由于没有共享资源不用上锁,类似于map-reduce,但是这样的方式无法保证结果一定是对的。之后又想每次维护对应的前缀都满足cnt前缀和满足l >= r即可,开多个线程来统计左右括号数量,之后统计第一段,第一段+第二段,1+2+3+。。。n段满足l >= r吧,后来面试官说这样也可以吧。
之后就是反问了,我说部门主要做点啥,是传统后端吗,他说主要是toB的业务,非数据库内核,做OceanDB上的一些具体应用,和传统互联网toC应用方向不太一样,让我可以去官网查查啥关键词来着,我也记不起了,后来问了问转正状况如何,他说往年转正概率挺大的。
#蚂蚁2024暑期实习##面经#