JAVA架構(gòu)師面試分享—鏈家網(wǎng)
本月7日去了一趟鏈家網(wǎng)面試,雖然沒有面上,但仍有不少收獲,在此做個簡單的分 享,當然了主要是分享給自己,讓大家見笑了。因為這次是第一次面試JAVA網(wǎng)站架構(gòu)師相關(guān)的職位,還是有些心虛的,畢竟之前大部分時間都是在做.NET相 關(guān)的技術(shù)工作,并且自己所負責過的項目規(guī)模都是比較小,并且差異也較大。在高并發(fā)性,高伸縮性的互聯(lián)網(wǎng)網(wǎng)站的架構(gòu)方面沒有太多的經(jīng)驗,只是在之前空閑時閱 讀李智慧老師的《大型網(wǎng)站技術(shù)架構(gòu)》一書給了我不少的啟發(fā)。面試過程比較簡單,首先是筆試,架構(gòu)師職位主要是一些知識的理解,也有一些數(shù)據(jù)庫查詢方面的基 礎(chǔ)試題。知識點方面比較偏重于NoSQL、緩存服務(wù)器集群、Session服務(wù)器等內(nèi)容。大體做的還湊合,因此面試官也比較客氣,和我更加深入的聊了相關(guān) 方面的知識,也包括該公司主要的組織架構(gòu)和盈利來源。
由于鏈家網(wǎng)到目前為止仍然不算特別出名,但在各大網(wǎng)站上已經(jīng)能經(jīng)??吹皆?公司基于房地產(chǎn)行業(yè)的研究報告。剛開始我最大的疑問就是這個公司和搜房網(wǎng)、安居客等有什么區(qū)別?這些網(wǎng)站都已經(jīng)存在多年,那么該公司有什么特別的地方可以 存活至今,并在這兩年內(nèi)發(fā)展迅速?在回答這些疑問之前,我稍微跑個題,介紹一下面試官老宋,這是我給他起的外號,那次見面應(yīng)該是第一次也是最后一次見他 了,但他給我留下了極深的印象。技術(shù)水平很高,很注意自己的外在氣質(zhì),溝通時十分和善,影響最深的是在面試時他全程用鋼筆記錄相關(guān)的信息,非常的專業(yè)和尊 重面試者。之所以提這個,主要是想說個人認為程序員在找一份工作時除了收入,公司的未來發(fā)展外,最重要的就是直屬領(lǐng)導(dǎo)的性格契合度了,適合的才是最好的。 只有這樣,你才能無論遇到多大的困難,都堅信團隊、項目能順利發(fā)展,自己多奉獻一些也是值得的,當然最終受益的也是自己了。
接下來,回答之前的問題,鏈家網(wǎng)是非常大型與房地產(chǎn)經(jīng)紀相關(guān)的公司,組織 架構(gòu)比較復(fù)雜和特殊,因為他并不是一家企業(yè)慢慢發(fā)展起來的,而又由鏈家網(wǎng)牽頭,和各地不同的房產(chǎn)經(jīng)紀公司聯(lián)合組建起來的。由于房地產(chǎn)政策的地區(qū)差異,各地 客戶群體需求差異,很難有一個非常統(tǒng)一的運營模式來進行管理。各地公司單獨運營,總部主要是一個互聯(lián)網(wǎng)的用戶入口,數(shù)據(jù)信息服務(wù)系統(tǒng)也是各自獨立,感覺比 較像原來特許加盟的形式,也算是一種互聯(lián)網(wǎng)+的實踐了。該公司與搜房網(wǎng)、安居客的差異來源于它的數(shù)據(jù)完全來之于本公司,基本是真實有效的,而搜房網(wǎng)等公司 的數(shù)據(jù)來源于各個房產(chǎn)經(jīng)紀公司或者經(jīng)紀人,信息非常的不可靠。簡單舉個例子,比如一套房子房東報價500萬,但一般來說這里面都有一定的砍價空間,那么房 產(chǎn)經(jīng)紀人在網(wǎng)上掛售這套房產(chǎn)時就會進行一定的減價,比如說495萬,于此同時,房東一般會和多家經(jīng)紀公司聯(lián)系,那么其他經(jīng)紀人看到這個報價,為了做成生 意,很自然的把價格報的更低,最后,甚至爆出400萬這種不可能成交的價格,只是為了接到潛在購買者的電話。這樣就形成了"劣幣驅(qū)逐良幣"的情況,使得網(wǎng) 站信息不再可信,同時由于一套房屋可以由多家經(jīng)紀公司掛售,因而網(wǎng)站上的房源數(shù)量往往遠多于實際的數(shù)量,給潛在購買者產(chǎn)生了很大的困擾。此外,由于鏈家公 司所轄房產(chǎn)經(jīng)紀公司,比如說上海的德佑公司,已有一定的體量,為了更進一步的保證房產(chǎn)的真實性,經(jīng)過房產(chǎn)局對在售房屋進行了全面的核查。借用老宋的話說就 是,"搜房他們是淘寶,鏈家是京東"。以上是對該公司經(jīng)營模式的介紹,對房產(chǎn)經(jīng)紀類企業(yè)深入互聯(lián)化有很大的借鑒作用。
然后開始技術(shù)部分的介紹,剛開始我也有很打困惑,為什么這家公司需要一個 OA方面的架構(gòu)師,經(jīng)過溝通我才知道,該公司目前有大約3萬名的房產(chǎn)經(jīng)紀,所以該公司的企業(yè)信息系統(tǒng),每天有將近1000萬得PV,抵得上一個中型網(wǎng)站, 每天的早上打卡(采用網(wǎng)上打卡)、爭搶客戶資源等活動會產(chǎn)生大量的并發(fā),類似于電商網(wǎng)站的秒殺,因而需要有高并發(fā)相關(guān)經(jīng)驗的工程師。
最后,是幾個主要的技術(shù)點,包括權(quán)限系統(tǒng)的設(shè)計,緩存服務(wù)器集群的架設(shè),消息隊列系統(tǒng)的構(gòu)建等。在此主要介紹前兩個,其他的會在之后補充。權(quán)限系統(tǒng)基本參考資深博主天空行馬的方案,如下圖所示。

主體結(jié)構(gòu)比較簡單,職位和項目組的設(shè)置可以同時滿足職能型和項目型的企業(yè) 組織架構(gòu),角色則對之前兩者進行了有限的補充,比如系統(tǒng)管理員等不能通過職位和項目組描述的情況。一般來說,系統(tǒng)中包含兩種類型的權(quán)限:模塊的權(quán)限;行為 的權(quán)限。權(quán)限組通常用于表示某一模塊中所有行為權(quán)限的集合。這個思路簡單清晰,便于實現(xiàn)和未來的擴展。在實現(xiàn)中,可以通過相關(guān)的權(quán)限代碼組合規(guī)則
來將權(quán)限信息保存在數(shù)據(jù)庫中,例如權(quán)限的數(shù)字或字母的表示組合。
分布式緩存集群的伸縮性不同于Web服務(wù)器集群的伸縮性,對于后者來說, 每一臺Web服務(wù)器上內(nèi)容相同,伸縮性只需要簡單的負載均衡算法即可達到。但每一臺分布式緩存服務(wù)器上數(shù)據(jù)各不相同,緩存訪問請求不可以再集群中任意服務(wù) 器上完成,需要先找到存儲該數(shù)據(jù)的服務(wù)器后訪問。同時新上線的服務(wù)器上沒有緩存數(shù)據(jù),下線的緩存服務(wù)器上有熱點數(shù)據(jù),會對分布式緩存集群的伸縮性設(shè)計造成 很大的困難。為了更好的闡述相關(guān)概念,接下來將以最常見的Memcached為例介紹相關(guān)設(shè)計與實現(xiàn),所圖所示。

過程非常簡單,Memcached API將應(yīng)用程序傳入的key進行哈希運算,然后使用簡單余數(shù)Hash算法(例如11/3=2),得到指定的節(jié)點Node2,然后存儲指定服務(wù)器。需要注 意的一旦涉及到服務(wù)器的擴容,以上見余數(shù)Hash算法就會遇到很大的問題,例如當要將3臺緩存服務(wù)器增加到4臺時(11/4=3),這時再Node3上找 不該緩存,緩存未命中的概率達到75%,并且會著擴容,為命中的概率不斷增大(N/N+1)。這時就會使用到比較流行的一致性hash算法,該算法通過一 致性Hash環(huán)的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)KEY到緩存服務(wù)器的Hash映射,過程若下圖所示。

算法的具體過程為:首先構(gòu)造一個232的整數(shù)環(huán), 根據(jù)節(jié)點名稱的Hash值(極可能的散列)將緩存服務(wù)器節(jié)點防止在這個Hash環(huán)上,然后計算需要緩存數(shù)據(jù)KEY的Hash值,順時針查找最近的節(jié)點,作 為目標節(jié)點。如上圖中,在集群擴容時,即在原有Node0-2的基礎(chǔ)上加入Node3,可以看到,唯一受影響的數(shù)據(jù)為Key3,如此緩存的命中率就變?yōu)榱?N/N+1,能滿足實際需要。實際代碼中,該還一般由二叉查找樹實現(xiàn),通過鏈接最外側(cè)的葉子節(jié)點形成環(huán)。但以上設(shè)計仍然存在一個問題,就是再擴容 后,Node0和1的負載量是Node2和Node3的兩倍。解決該痛點的方法是將物理緩存服務(wù)器節(jié)點虛擬化為N個虛擬節(jié)點,均勻的分散到環(huán)中去,使得負 載盡可能的均衡。這樣就做到了新增物理服務(wù)器對原有物理服務(wù)器的影響一致,也就是該算法名稱的由來。
注:本文主要供自己學(xué)習,不妥之處望見諒。
參考資料:
[1]天空行馬. OA系統(tǒng)權(quán)限管理設(shè)計方案[EB/OL]. http://www.cnblogs.com/kivenhou/archive/2009/10/19/1586106.html。
[2]李智慧. 大型網(wǎng)站架構(gòu)技術(shù)[M]. 上海:電子工業(yè)出版社, 2012. 123-182





















