大环境下瑟瑟发抖辞职的第二天,拿了两个 offer
本來(lái)想找 PHP 的,誤打誤撞發(fā)現(xiàn)廣州的 Golang 和 PHP 混合用的公司還蠻多,恰好約面試的都是 Golang,挺納悶的難道 PHP 真的萎靡了?不過(guò)有時(shí)候?qū)?Go 結(jié)構(gòu)體真的不習(xí)慣,這一點(diǎn) PHP 的高級(jí)面向?qū)ο筇匦蕴懔恕?/p>
面試過(guò)程:
1. 看你簡(jiǎn)歷里也有用過(guò) Go,Go 和 PHP 在運(yùn)行的時(shí)候有什么區(qū)別和優(yōu)勢(shì)?
答:PHP 每個(gè)請(qǐng)求進(jìn)來(lái)時(shí)都會(huì)創(chuàng)建 fpm-worker 進(jìn)程,從而導(dǎo)致系統(tǒng)并發(fā)高時(shí) CPU 會(huì)產(chǎn)生頻繁創(chuàng)建進(jìn)程的開(kāi)銷,而 Go 不會(huì)。
2. 你剛剛說(shuō)到 PHP 那既然是多進(jìn)程,那怎么共享數(shù)據(jù)?
答:PHP 既然是多進(jìn)程,進(jìn)程資源的地址和 PCB 空間都是獨(dú)立的,沒(méi)辦法共享數(shù)據(jù)吧。
3. 那我如果要在 Go 里實(shí)現(xiàn)共享數(shù)據(jù),有什么方式?
答:我在項(xiàng)目里使用過(guò)協(xié)程,可以用 channel
4. 那 channel 的本質(zhì)和底層是什么?
答:這個(gè)知識(shí)點(diǎn)有點(diǎn)模糊,我想想,如果沒(méi)記錯(cuò),我記得就是 linux 的管道吧
5. 那 linux 的管道有什么特性?
答:管道的特性應(yīng)該是只能等一邊寫(xiě)完,另一邊才能讀,不知道我回答的對(duì)不對(duì)?
6. 對(duì)你說(shuō)得沒(méi)錯(cuò),那你覺(jué)得管道是用什么實(shí)現(xiàn)的?
答:不好意思,這題我不會(huì)
7. 其實(shí)管道就是文件,那對(duì)文件操作就是加鎖
答:對(duì)對(duì)對(duì),我想起來(lái)了,其實(shí)這里涉及到資源的搶占,那系統(tǒng)對(duì)資源的搶占肯定就是加鎖實(shí)現(xiàn)。
8. 既然剛剛你也提到協(xié)程,可以描述下 Go 的協(xié)程原理嗎?
答:Go 的協(xié)程是基于 CSP 并發(fā)模型的 GPM 調(diào)度機(jī)制,M 可以理解為處理機(jī) CPU,P 就是 Go 底層用來(lái)管理 Goroutine 協(xié)程的。
9.(這個(gè)時(shí)候面試官拿了一張白紙過(guò)來(lái))寫(xiě)一個(gè)二分查找的算法看看吧,用 PHP 或 Go 都可以
答:好,那我用 PHP 寫(xiě)吧(PS: 這里我用的是遞歸法,要注意二分查找的臨界問(wèn)題)
10. 嗯,算法沒(méi)問(wèn)題,問(wèn)一點(diǎn)網(wǎng)絡(luò)的吧,socket 用過(guò)嗎?
答:websocket 用過(guò),在做直播聊天室的時(shí)候會(huì)用到長(zhǎng)連接
11. 那你覺(jué)得 websocket 是基于什么協(xié)議?
答:是基于 TCP 協(xié)議的
12.TCP 客戶端和服務(wù)端是怎么建立連接通信的?
答:(ps:一開(kāi)始答錯(cuò)了,我說(shuō)是 ack 吧,面試官糾正是 syn)然后我恍然大悟接著說(shuō),第一步是客戶端發(fā)送 syn,第二步是服務(wù)器應(yīng)答 syn+ack, 第三步是客戶端回復(fù) ack
13. 那 TCP 握手是幾次,斷開(kāi)是幾次?
答:握手是三次,斷開(kāi)是四次(ps: 有些面試官會(huì)問(wèn)為什么斷開(kāi)要四次,這里涉及到半連接等待關(guān)閉,幸好沒(méi)問(wèn))
14. 假設(shè)我們現(xiàn)在要做一對(duì)一視頻聊天,每日 DAU 可能達(dá)到幾十萬(wàn)以上,后端怎么實(shí)現(xiàn)一對(duì)一匹配的算法?還有,怎么實(shí)現(xiàn)快速的匹配服務(wù)器不會(huì)有壓力問(wèn)題?
答:我想一下。用戶登錄的時(shí)候,如果未開(kāi)始匹配,可以把用戶放到 redis 里的 set 集合里,通過(guò) SRANDMEMBER 命令隨機(jī)抽取人出來(lái)就好了 ,至于 redis 的 value 最大可以保持 512m 數(shù)據(jù),也就是理論上我們承載可以達(dá)到上千萬(wàn)上億用戶都不是問(wèn)題,至于要保持 redis 的高可用,可以用 rdb 或 aof 做數(shù)據(jù)持久化,另外,redis 也有哨兵模式,主 redis 掛了也可以選舉抽取空閑的 redis 服務(wù)器頂上
15.mysql 主從的時(shí)候有沒(méi)有遇到過(guò)主從延遲同步的情況?是怎么解決的?
答:emmmmm,這個(gè)情況我還沒(méi)遇到過(guò)。
16. 你也知道我們是做社交 APP 的,如果我們要做一些興趣推薦的內(nèi)容或者人,你會(huì)怎樣實(shí)現(xiàn)?
答:可以用 ElasticSearch,我以前的項(xiàng)目有配合 ik 中文分詞使用,缺點(diǎn)是比較吃機(jī)器內(nèi)存。
總結(jié):
面試完和面試官聊了聊,得知面試官是從 YY 出來(lái)的
從整個(gè)面試流程來(lái)看,面試官太會(huì)引導(dǎo)問(wèn)題了,從應(yīng)用層面一點(diǎn)點(diǎn)問(wèn)出底層細(xì)節(jié),也加予了適當(dāng)?shù)奶崾?#xff0c;這一點(diǎn)很值得學(xué)習(xí)
另外一個(gè) offer 是醫(yī)院體系下醫(yī)療行業(yè),因?yàn)闆_擊較大未來(lái)盈利可能有困難,規(guī)模是 20 人,就不考慮接 offer 了,不過(guò)還是分享一下面試的內(nèi)容
1、redis 在項(xiàng)目里用過(guò)哪些數(shù)據(jù)類型?
2、怎么解決 redis 在并發(fā)下商品超賣(mài)的問(wèn)題?
3、Golang 長(zhǎng)連接的時(shí)候是怎樣做心跳機(jī)制的?
4、說(shuō)一下你是怎么理解微服務(wù)的?
5、mq 用過(guò)嗎?在什么場(chǎng)景使用的?
總結(jié)
以上是生活随笔為你收集整理的大环境下瑟瑟发抖辞职的第二天,拿了两个 offer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 实现延时任务的 4 种实现方案!
- 下一篇: 吊打 Tomcat ,Undertow