上海沐瞳科技-Go社招-一面凉经-硬-7.29
- 自我介绍
- 您之前是做一个中台开发的,是什么的样的服务啊,什么业务啊
- 有没有什么值得分享的点,解决了什么疑难的问题呀,具体的一些不错的产出啥的
- 项目-抓数系统
- 为什么要用到kafka
- 感觉你们数据库的数据量也不大,也就几百个账号要抓取,为社么不用rpc调用而用kafka呢,感觉也没啥峰可削
- 用go多久了
- 什么类型可以作为map 的key
- 什么是自旋锁?
- go里面怎么实现一个自旋锁?
- 用sync/atomic来实现,具体怎么操作?
- 什么情况下会更改失败
- 场景:假设有10个goroutine,希望一个goroutine退出的时候,另外几个goroutine也尽快退出,这个怎么实现?
- 不用context.withcancel怎么实现?
- 为社么要关闭这个channel来做,而不是向这个channel发消息之类的?
- 关闭channel有一个问题,如果两个goroutine差不多时间要结束,大家都尝试去主动关闭这个channel,一个channel只能被关一次,关两次会panic掉,怎么解决这个问题呢?(我的回答:指定一个专门的goroutine去关闭channel,其他的goroutine只需要在结束前向channel发一个信号)
- 那直接发信号给channel,另外一边接受这个消息不就一样了嘛,为什么要有专门的goroutine,这个好处是什么?
- 一个是我说的关闭信号退出,当中有一个goroutine专门负责做关闭这件事情;还有一些goroutine是说我直接发消息,没有当中,直接收到消息,收到消息退出。这两种方案,第二种方案更简单一点,不需要当中有goroutine,是不是选第二种方案就比第一种方案更好呢。
- sync.pool 这个你知道干嘛用的么
- go里面的map开始的时候指定一个大小,后面如果key越来越多,会自动扩容,从原理上来讲自动扩容大概是个什么样子的
- 假设map有10万数据了,自动扩容的时候再开一个map会产生一个多大的map
- 20万,这个时候要把所有的数据都一个个重新计算他的key然后搬过去,这个时间会很长,知道他是怎么保证性能的吗。虽然你用的角度上是无感的,你不会发现他有一个很长的等待过程。这个是怎么做到的?
- 渐进式的怎么渐进呢,具体什么时候触发这个搬运的工作?
- 什么时候做的这些小步骤迁移的,一开始不会把数据迁完,后面总会不断地迁,那到底什么时候迁呢?
- 这个一步步迁移是什么时候发生,已经开始扩容了,但是不会一下子全部扩完,你刚说的渐进式扩容,那这个渐进式也是要做的嘛,是什么时候做的呢?(总算引导着我答出来了:每次有新的写入操作时,go会选择一部分已有的数据迁移到新的map,这样渐进的迁)
- mysql
- 场景:一张用户表,有用户的基础信息,id,昵称之类的。有一列是一个身份证号,业务有一个需求,要绑定身份证号。这个用户要么不绑定身份证号,要么就是身份证号和用户是一 一对应的关系。用户可能不会立马就绑定身份证号,后面可能注册登录流程到一定阶段就让他绑身份证号了。身份证号和用户必须是唯一对应的关系,这个在绑定过程中的唯一对应是怎么实现的呢?
- redis
- 场景:redis里面要更新两个key,需要保证他们要么同时成功,要么同时失败,有点像事务的原子性。这两个key在业务上是强相关的,希望这两个key要么同时set成功,要么一条都不成功,这两个key是不同的数据结构,所以不能用一条语句直接更新,该怎么实现这个功能?
- lua脚本可以,为什么?
- lua脚本同时操作这两个key,假如用的集群模式待分片的,那用lua脚本会不会有问题
- 假如我要用lua脚本,两个key,有什么办法去解决这个问题呢?
- 知道分片的hash算法吗?为什么断定前缀一样就会分到同一个槽里面,他本质不是一个b+树啊
- 场景:redis里面要更新两个key,需要保证他们要么同时成功,要么同时失败,有点像事务的原子性。这两个key在业务上是强相关的,希望这两个key要么同时set成功,要么一条都不成功,这两个key是不同的数据结构,所以不能用一条语句直接更新,该怎么实现这个功能?
- k8s
- 有自己搭建过一个简单的k8s环境然后上去部署服务吗
- k8s服务发现是怎么做的?
- 场景:k8s里面有一个a服务和b服务,a、b服务各有10个pod,ip都不一样。a服务要访问到b服务的某个pod上,那这个过程是怎么样的你知道嘛?他怎么拿得到b服务的某一个pod的ip呢?
- 反问
- 岗位是给游戏用的业务中台,有支付,活动,官网等等
- 项目经验还需要再丰富一些,你现在工作年限不多,项目接触的还是比较少
- 你的面试情况要跟团队内部沟通一下,后续会跟hr