大环境下瑟瑟发抖辞职的第二天,拿了两个 offer
本來想找 PHP 的,誤打誤撞發現廣州的 Golang 和 PHP 混合用的公司還蠻多,恰好約面試的都是 Golang,挺納悶的難道 PHP 真的萎靡了?不過有時候寫 Go 結構體真的不習慣,這一點 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 主從的時候有沒有遇到過主從延遲同步的情況?是怎么解決的?
答:emmmmm,這個情況我還沒遇到過。
16. 你也知道我們是做社交 APP 的,如果我們要做一些興趣推薦的內容或者人,你會怎樣實現?
答:可以用 ElasticSearch,我以前的項目有配合 ik 中文分詞使用,缺點是比較吃機器內存。
總結:
面試完和面試官聊了聊,得知面試官是從 YY 出來的
從整個面試流程來看,面試官太會引導問題了,從應用層面一點點問出底層細節,也加予了適當的提示,這一點很值得學習
另外一個 offer 是醫院體系下醫療行業,因為沖擊較大未來盈利可能有困難,規模是 20 人,就不考慮接 offer 了,不過還是分享一下面試的內容
1、redis 在項目里用過哪些數據類型?
2、怎么解決 redis 在并發下商品超賣的問題?
3、Golang 長連接的時候是怎樣做心跳機制的?
4、說一下你是怎么理解微服務的?
5、mq 用過嗎?在什么場景使用的?
總結
以上是生活随笔為你收集整理的大环境下瑟瑟发抖辞职的第二天,拿了两个 offer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实现延时任务的 4 种实现方案!
- 下一篇: 吊打 Tomcat ,Undertow