心得

本来想找PHP的,误打误撞发现广州的Golang和PHP混合用的公司还蛮多。

面试过程

  1. 看你简历里也有用过Go,Go和PHP在运行的时候有什么区别和优势?

    答:PHP每个请求进来时都会创建fpm-worker进程,从而导致系统并发高时CPU会产生频繁创建进程的开销,而Go不会。

  2. 你刚刚说到PHP那既然是多进程,那怎么共享数据?

    答:PHP既然是多进程,进程资源的地址和PCB空间都是独立的,没办法共享数据吧。

  3. 那我如果要在Go里实现共享数据,有什么方式?

    答:我在项目里使用过协程,可以用channel

  4. 那channel的本质和底层是什么?

    答:这个知识点有点模糊,我想想,如果没记错,我记得就是linux的管道吧

  5. 那linux的管道有什么特性?

    答:管道的特性应该是只能等一边写完,另一边才能读,不知道我回答的对不对?

  6. 对你说得没错,那你觉得管道是用什么实现的?

    答:不好意思,这题我不会

  7. 其实管道就是文件,那对文件操作就是加锁

    答:对对对,我想起来了,其实这里涉及到资源的抢占,那系统对资源的抢占肯定就是加锁实现。

  8. 既然刚刚你也提到协程,可以描述下Go的协程原理吗?

    答:Go的协程是基于CSP并发模型的GPM调度机制,M可以理解为处理机CPU,P就是Go底层用来管理Goroutine协程的。

  9. (这个时候面试官拿了一张白纸过来)写一个二分查找的算法看看吧,用PHP或Go都可以

    答:好,那我用PHP写吧(PS:这里我用的是递归法,要注意二分查找的临界问题)

  10. 嗯,算法没问题,问一点网络的吧,socket用过吗?

    答:websocket用过,在做直播聊天室的时候会用到长连接

  11. 那你觉得websocket是基于什么协议?

    答:是基于TCP协议的

  12. TCP客户端和服务端是怎么建立连接通信的?

    答:(ps:一开始答错了,我说是ack吧,面试官纠正是syn)然后我恍然大悟接着说,第一步是客户端发送syn,第二步是服务器应答syn+ack,第三步是客户端回复ack

  13. 那TCP握手是几次,断开是几次?

    答:握手是三次,断开是四次(ps:有些面试官会问为什么断开要四次,这里涉及到半连接等待关闭,幸好没问)

  14. 假设我们现在要做一对一视频聊天,每日DAU可能达到几十万以上,后端怎么实现一对一匹配的算法?还有,怎么实现快速的匹配服务器不会有压力问题?

    答:我想一下。用户登录的时候,如果未开始匹配,可以把用户放到redis里的set集合里,通过SRANDMEMBER命令随机抽取人出来就好了 ,至于redis的value最大可以保持512m数据,也就是理论上我们承载可以达到上千万上亿用户都不是问题,至于要保持redis的高可用,可以用rdb或aof做数据持久化,另外,redis也有哨兵模式,主redis挂了也可以选举抽取空闲的redis服务器顶上

  15. mysql主从的时候有没有遇到过主从延迟同步的情况?是怎么解决的?

    答:减少大事物,优化执行 sql,提高 sql 运行时间。

  16. 你也知道我们是做社交APP的,如果我们要做一些兴趣推荐的内容或者人,你会怎样实现?

    答:可以用ElasticSearch,我以前的项目有配合ik中文分词使用,缺点是比较吃机器内存。

  17. redis在项目里用过哪些数据类型?

  18. 怎么解决redis在并发下商品超卖的问题?

  19. Golang长连接的时候是怎样做心跳机制的?

  20. 说一下你是怎么理解微服务的?

  21. mq用过吗?在什么场景使用的?