腾讯音乐-全民K歌国际版面经-Go社招-超硬-7.19
- 面试官先做一个简单的介绍:面的岗位是 腾讯音乐-全民k歌-国际版-直播歌房后台研发工程师的一个岗位;你应聘的这个岗位主要是做直播相关的一些功能;开发语言go和c++
- 5分钟以内的自我介绍
- 你们公司为社么技术团队裁撤之后会留下你一个人
- 这个岗位是base深圳你能接受吗
- 项目-系统重构-数据迁移
- 你是怎么理解微服务的
- 为什么会提升系统的可拓展性
- 那他相比于单体的服务有什么缺点么
- 服务之间还要通信,这也需要成本,这里的成本指的是什么成本,它的成本体现在哪
- 你做了一个系统重构的事情,把数据库从MongoDB迁移到mysql。为什么要做这个事情?
- 你做的这个选择并不是从0到1的一个技术选型,你们项目原来用的MongoDB然后你们改成了mysql嘛。那你怎么评估你去迁移一个异构的DB的这个成本的问题呢。因为你的迁移过程也会提升的一些工作量,你要把原来Mongo的数据同步到mysql里面,那你这个同步也是需要很大的工作量的。 就是你考虑的就只是他的一个成熟度(mysql比mongo成熟)或者说mysql被其他开发同学更容易接受的程度来做的迁移吗
- mysql支持事务,mongo不行,那如果是选用那种最终一致性的方案呢?有什么原因导致你们不使用这种方案呢?
- 你在迁移的过程中,数据的同步是怎么做的?(我的回答:新的数据库写到mysql,然后写脚本将老的mongo数据迁移到myql)
- 在你迁移的过程中,一个业务既要读新的数据又要读老的数据怎么办
- 你这样迁移有点暴力,如果你迁移过程中有一些数据异常的话你怎么发现呢?还有一个问题是你这个是异构的数据库迁移,他们两个不是一种类型的数据库,那你这个中间怎么办保证每一条数据正常的迁移到了每一个mysql的数据库中
- 一个场景:假如有一个唯一键,他在mongo里面已经有这条数据了,你切到写新的mysql 的时候,因为没有这条数据,那他又被重复写了一次是么?
- 项目- 优化服务器
- 优化服务器引入了一个分布式缓存的技术,这个具体是怎么实现的
- 那你是怎么保证redis缓存和数据库的数据一致性的 (脑瘫了我:我回答的是缓存先写数据库后写。。。)
- 那你如果写缓存成功,数据库失败,那你缓存读到的就是一个脏数据吗
- 先写数据库成功后再写redis,那如果缓存更新失败了呢?你怎么知道什么时候该将数据库的数据同步到缓存?同步是怎么做的?
- 缓存有那种过期时间的极致吗?还有不会过期一直生效的?
- 有过期的话多久过期
- 那如果缓存同时过期会有什么问题?怎么解决这个问题
- 项目-数据抓取业务
- kafka在这里面扮演的什么角色
- 这个业务为什么要经过kafka这一层
- 你们的账号的量有多大
- 像你说的为了避免同一时间压力过大的话,也可以把定时任务的执行时间分散的呀,kafka没有体现出他的一个价值。因为你的触发是定时任务控制的,并不是一个不可控的事情。并不是像有用户请求有高峰期这种情况嘛,那用kafka来做这个削峰就没有太大意义了。那还有其他考虑导致你们用kafka吗
- 防止账号丢失问题,但是你本来就有一个确认机制嘛,如果丢失了的话,当作下游处理失败的一个方式重新触发不就行了
- 项目-抖音微信小游戏归因业务
- 微信小游戏的token怎么存的?存在sync.map里面。是服务内存吗?为社么会使用服务内存?
- 为什么没有使用redis或者其他的外部的缓存方案
- 你的用户量多少?
- 你使用这种方案的话,假如现在有一百个这样的实例,你的用户量有两万的话,那每个实例都会存两万的用户的token,那这种方案有没有什么缺陷?(当时脑子懵了,我被面试官带进去了,我们这个sync.map存的不是用户的token,存的是游戏的token,就归因2个游戏,100个实例最多也就缓存200个token到内存,而不是2万个用户x100,按照用户来存的话肯定就得用redis了,哭死。°(°¯᷄◠¯᷅°)°。)
- mysql
- mysql中索引是怎么实现的
- 那为什么可以使用b树来实现?为什么mysql里面不使用b树
- go
- 切片是怎么实现的
- 如果在go里面并发的去读写一个map的话会出现什么问题?可能会导致panic,为什么要做这种拦截呢?
- 那如果要并发的去读写一个map的话要怎么解决
- go里面的sort排序是怎么实现的?
- 快排是什么?是稳定的吗?
- 协程和线程有什么区别?线程开销大的原因是什么?协程里面也是有上下文切换的,为什么线程会消耗更多的cpu资源?
- 算法手撕
- 反问
- 做app的后台,团队主要负责商业化的一些功能,包括直播,歌房,游戏等都是我们团队负责的
=======================总结=======================
- 这场面试的质量很不错,顶级大厂的面试官很有实力
- 一直在忙于交接和工作,完全没准备,裸面,项目这块被拷打了,通过这场面试算是知道自己项目上准备的不充分和薄弱点(项目的每一步设计要多想想为什么这么做,出于什么考虑)
- 缓存和数据库一致性这块没讲好
- kafka当时的理解不够深入,这一块也没讲好
- token缓存这块被带进去了,讲错了这样设计的真正原因
- 这场面试全程被面试官牵着鼻子走,以后得学着将面试官往自己会的方向引了
- 今天复盘的时候感觉很可惜,当时项目这块答的漏洞百出,如果现在面的话也许会是一个新的结果了
- 有点可惜,以面促学吧