「字节跳动Golang面试」golang服务器开发面经
一次面试有前后两个面试官,面试官问的问题如下,其中还带有面试官的提示:
一面:自我介绍一下吧
网络相关1. TCP 和 UDP 的区别是什么?
2. TCP 的三次握手解释一下,为什么是三次握手?(答三点)
3. UDP 在什么时候使用?
4. 浏览器输入一个域名之后会发生什么?
5. 登陆 baidu 之后,下次打开浏览器就不用再登陆了,怎么做到?
6. https 和 http 的区别是什么?公钥私钥是怎么来的?浏览器如何判断公钥的正确性?
数据库相关1. 事务属性 ACID 都是什么?
2. 乐观锁和悲观锁的区别?乐观锁怎么判断一致性?
3. 用过哪些存储引擎?Innodb 和 Myiasm 的区别是什么?
4. 你们有没有用到其他类型的数据库?(比如mongodb,我说没有,面试官就没让我回答,应该多看看)
其他1. 如何防止死锁,可以举例各种语言中都是怎么做的?(1. 不可以复制锁,2. 还有其他的么)
算法题1. 蛇形打印一棵二叉树上的 value
二面:1. 自我介绍一下
2. 说一下有挑战的项目
RPC 相关:
1. RPC 调用中,客户端都发生了什么,要完成哪些工作?(serialize,connection,parse,我主要说了 serialize 中的 protobuf)
2. RPC 客户端如何处理请求失败?(面试官想问客户端如何实现失败重试机制,我引申了 nginx 中的重试方式,提到了幂等性重试)
架构相关:
1. 水平拓展一个新的机器时,都有哪些操作或步骤?(拉取机器的镜像,下载代码,启动服务)
2. 启动服务的时候,都有个启动的时间,这段时间机器可以有流量么?如果没有流量,什么时候开始可以有流量?用什么机制让 Haproxy 开始给新机器发流量?(应该就是服务发现机制)
3. 同上,更新代码部署时,有个重新启动的时间?这段时间有流量么?如果没有,什么时候恢复流量,怎么恢复流量?比如如何在 Haproxy 注册部署好的机器的 ip ?(我谈到了蓝绿部署,在 proxy 中删掉再恢复机器的 ip)
算法题:有 10 万个数,我们要找出最大的 1000 个数,如何做?(因为只要 1000 个数,甚至不关心它们的顺序,可以用比 nlogn 排序更快的方法,因为可以不用对 10 万个数全都排序) 面试官提示,可以用小根堆,取出前 1000 个数组成一个小根堆,后面不断跟 root 比较,小的抛弃,大的插入堆,并替换 root。