高级PHP面试题目分享(架构篇)

今年8月份开始就准备从老东家离职看看新的机会,在找新的工作时,给自己定的方向就是PHP或者Java方面的工作,希望找朝阳行业,这期间经历的面试不多,最终拿到心意的offer,也算达到了自己的预期,在此给大家分享下在面试过程中遇到的一些有意思的题目,供大家参考。

我个人在以前做了2年c++,这期间接触到了分布式相关理论和技术框架,也初步研究过一些经典的产品,类似memcache,Thrift等,后续去现在的公司4年,开始接触PHP开发,从最初的PHP单机部署到最终的微服务化,也较完整的经历了整个技术栈的迭代,相对而言,见识较多,只是这期间做了比较多业务,技术上的深耕不够,这也是这次面试一些公司时的软肋。

面试中接触的题目有架构设计和具体技术方面的,下面就分类讨论,一些题目是开放性的,如果大家有更好的答案,可以在评论里面讨论,另外开放性的题目只是提一些方案,具体实施方面不会涉及太多,今年面的公司不多,面了4家后拿到offer,题目有限,请见谅。

一、架构

1、这个是一个做海外直播的公司聊到的题目,现在有个房间,里面有超过2000人,现在主播发了一条消息,如何设计系统让其他人更快的接收到消息?

我个人当时提了2个方案,其中一个方案参考kafka消息队列模型,服务器端只存储消息,不主动推送消息,而让客户端主动来拉取,提出这个方案主要是基于降低服务器端的负载和复杂度,不好的一个点就是客户端需要轮询,消息不及时,当时我提了这个方案的优点和缺点,面试官也认可,同时反馈微信群早起的方案也是这样。

第二个方案是类似swoole内部通信模型,服务器和每个客户端建立长连接,有消息投递时,循环客户端进行消息投递。面试官继续问到有很多客户端时,这种方案是否可以及时投递出去,这里答复类似swoole的网络模型,通过多线程对客户端分组投递,客户端是否可以投递,通过多路复用的方式去解决。面试官继续问到对于小的消息是否可以默认为客户端可写,面试官提到这个问题时,我其实也想到了,对于小的消息且客户端和服务器端交互不多的情况下,可以假设可写,这里我记得之前在哪个产品中看到过,类似首次直接写,如果超时了(配置了多路复用的超时器),再次加入到多路复用中去监听可写。

2、现在有个访问量很大的首页,平常首页内容有更新诉求,如何设计方案能更好的支撑?

这里我围绕着nginx去说的,nginx能支持大量的链接是有目共睹的,我最终给出的方案是通过nginx+openresty+lua+redis的方案,即前端访问全部到nginx,同时通过openresty+lua来读取redis内容提供展示内容信息,首页内容的变更通过后台更新redis内容来满足,面试官没再继续问题,就到此。

3、如何保证系统的高可用?

这个题目其实很大的,我回答的不是很全面,这里有些是后面自己考虑完后整理的,首先提到了系统的高可用部分是由技术的高可用和系统运营的高可用部分,其中能让系统高可靠运营更重要,所谓的高可靠运营是指高效发布、测试和监控等。技术上的高可用可以用防止单点、框架支持无状态和快速扩容、主从、keepalive等机制去保证,而高可靠运营牵涉到稳定的测试环境和完整的研发流程,能将更多的可能导致系统不可靠部分解决在更前面的阶段,发布的重要性不言而喻,在出现问题时,能快速回退版本解决问题,而不是在现有版本上修改bug去解决,更能保证系统的稳定性,至于监控是在出现问题时更快的定位到问题,这里可能还有更多方案,我也在学习中,后面想到了再补充。

4、如何设计一个高效的server?

这个题目回答的不好,当时面试有点压抑,面试官根本不给任何反馈,不确定自己的回答是否符合要求,当时就提了用master-worker的方式做进程管理,即master用来做管理worker进程的任务,而worker进程完成业务逻辑处理,至于网络模型则用epoll去实现,我回答了这个后,就没再说话,面试官也没再问,我预期没达到要求,总的而言应该是没有get到面试官的点,这里还牵涉到server的部署方案,当并发量大的时候,如何支持,如何和客户端交互等等,这里核心的一个点还是没有咨询下面试官这个server处理哪种类型的业务,如果是纯内存的操作的话,完全可以用redis和memcache的方案去做,部署方面增加TwemProxy等,如果是其他类型业务,可以考虑增加nginx做代理,无状态的设计server端。

5、电商业务在设计系统时的难点在哪里?

这个其实是很开放的问题,从面试官后续反馈的情况来看,面试官实际没做过电商,他其实想问的是如何设计一个秒杀系统,哈哈,我从自己的经验回答了,我当时的回答是B2B类的电商ERP系统,在大业务情况下,如何保证货物对账体系稳定,健康,达到财务侧的要求,面试官没回答什么,继续问如何设计一个秒杀系统,这里我的回答就集中在一个并发情况下如何保证扣减正常,这里提到了用分布式锁去保证库存的扣减,如果业务量不是很大的情况下,用mysql锁也可以实现。

你可能感兴趣的:(职业发展)