亞馬遜的研發(fā)崗面試經(jīng)驗(yàn)總結(jié)(一年社招)
亞馬遜的研發(fā)崗位叫做SDE,我面試的就是這個(gè)崗位。
一面:
1 多線程的通信,同步方式。面試官問我 volatile 和 synchronized 的區(qū)別。 我從底層原理方面講了兩者的實(shí)現(xiàn)方式,主要解釋了 synchronized 基于 mutex lock 實(shí)現(xiàn),重 量級鎖,需要從用戶態(tài)切換到內(nèi)核態(tài)。volatile 則是通過插入內(nèi)存屏障的方式,保證變量讀 寫的可見性。
2 集合類用過哪些 當(dāng)時(shí)回答的是 ArrayList,linkedlist,hashmap 這類簡單的集合類,于是面試官就問了 hashmap 的實(shí)現(xiàn)原理,以及和 chm 的比較,不同版本 JDK 的區(qū)別。也是比較老生常談的問題了。
3 JVM 的內(nèi)存模型 說完內(nèi)存模型的主要情況,面試官開始問我關(guān)于內(nèi)存泄漏和內(nèi)存溢出相關(guān)的問題,也比較簡 單,另外還問了 GC 相關(guān)的問題。
4 NIO 和 BIO 的區(qū)別 主要就是講述 BIO 的阻塞式 IO 讀寫,然后講一下 NIO 的實(shí)現(xiàn)原理,相關(guān)類,并且說到 IO 多 路復(fù)用的實(shí)現(xiàn)方式,底層的 epoll 實(shí)現(xiàn)方式等等。
5 算法題:實(shí)現(xiàn)一個(gè) LRU 只要求實(shí)現(xiàn)超過容量時(shí)的緩存淘汰,不用處理緩存超時(shí)的問題,所以只要寫一個(gè)雙向鏈表來 存節(jié)點(diǎn)即可。另外,不能直接使用 linkedhashmap 實(shí)現(xiàn),所以直接用 hashmap 作為成員變量, 另外寫一個(gè)含有容量參數(shù)的構(gòu)造方法即可,也是比較常見的問題了。
6 n 個(gè)有序鏈表合并,怎么實(shí)現(xiàn)。 剛開始說的是直接合并,然后優(yōu)化使用多機(jī)進(jìn)行。后來看了一下,可以用最小堆實(shí)現(xiàn)。
二面:
這輪是經(jīng)理面
1 項(xiàng)目
2 項(xiàng)目的多線程問題
3 項(xiàng)目的架構(gòu)
4 項(xiàng)目的數(shù)據(jù)庫使用,部署方式,緩存部署方式。
5 項(xiàng)目的實(shí)際場景
6 講一下 JVM 的內(nèi)存分區(qū)
7 秒殺系統(tǒng)架構(gòu)設(shè)計(jì) 秒殺系統(tǒng)設(shè)計(jì)也是一個(gè)比較常見的問題了。一般可以分幾個(gè)方面作答。 首先,前端限制訪問時(shí)間,以及同一 IP 的訪問次數(shù)。 然后,第一層的服務(wù)做負(fù)載均衡,比如使用 nginx,然后服務(wù)器做集群。 接著,可以用消息隊(duì)列做削峰和限流,然后做一層緩存,最后只有少量請求到達(dá)數(shù)據(jù)庫。 面試官問 nginx 怎么做高可用,前一層能不能再做負(fù)載均衡,我回答的是 nginx 也做集群, 前一層可以用硬件負(fù)載均衡或者 dns 服務(wù)器做第一層負(fù)載均衡。 另外面試官還問了如果有 ddos 攻擊怎么辦,我剛好想到通過人機(jī)驗(yàn)證來避免大量肉雞的攻 擊,于是就說了驗(yàn)證碼的方式,面試官也說可以。
8 Redis 的分布式部署 說了 Redis cluster 的部署方式,其實(shí)就是分片加哨兵的部署方式,另外 Redis 還可以使用 codis 這類***來做分布式。
9 MySQL 的主從部署,讀寫分離。 這個(gè)就是比較常見的 MySQL 部署方案了,稍微說了一下實(shí)現(xiàn)方式就沒再問了。
10 cap 定理 講了一下為什么三者只能選兩者,這個(gè)問題還是挺繞的。 11 負(fù)載均衡怎么做
12 kafka 的作用,持久化,其他問題 kafka 之前看了一些比較好的文章,但是時(shí)間一久就忘了,于是我就說了讀寫性能好,以及 多個(gè)副本的部署方式。
13 前端解決一些無效的請求過濾,怎么做
14 有什么 offer,為什么想要換工作,工作不注重穩(wěn)定性嗎?想去哪里工作。
#亞馬遜##面經(jīng)##社招##軟件研發(fā)工程師#