1. 程式人生 > >與阿里高階技術專家的面聊

與阿里高階技術專家的面聊

   作為非計算機碩士畢業的應屆生,當17年以java外包身份進入阿里工作的時候,我的內心充滿著期待,儘管身份是非正式編制,但一直以來阿里的各種牛逼技術資訊讓我憧憬著一睹其芳容。一年的時間裡,我盡我所能的接觸各種中介軟體(tair、tddl、rocketmq、hsf、schedulex、diamond等等),瞭解其原理思想,全面的熟悉阿里的運維體系,視野得到了極大的拓寬,自認這一年我沒有虛度。時至今日,於我自己可以說是收穫滿滿。這一年的成長,除了歸功於自己的努力,更得感謝主管的信任和支援,讓我有機會真正深入參與及負責阿里專案;儘管部門年後大調整,仍舊幫我爭取到跟這位高階技術專家面聊的機會,嘗試著跟實際工作年限不太相符的職位轉正。此次面聊,確實不同於之前經歷過的面試,讓我感覺就是更全面、更深入的技術和思維能力挖掘。正因為經歷寶貴,便花了些時間將問題回憶並整理記錄下來,部分題目加了一些自己的思考解答,當然答案不會很具體,更多的是思路和方向,如果需要具體問題解決辦法的還需要自己另尋,不過還是希望對有需要的同行夥伴或者未來某天的自己有益吧。剛開始寫文章,如有不當或者考慮不全的地方,歡迎指正。

1.專案經歷具體幹啥

以工作經驗的先後依次簡單介紹自己的工作歷程,每一段的角色、突出性貢獻以及自己的成長,有突出重點、邏輯性強

2.七星陣使用者體驗差具體定位問題

        自己在阿里做的一個專案,目前在國內阿里集團、螞蟻和新加坡進行了部署上線,是一個應用於公司內部的資料安全產品。由於保密性要求,這裡不做過多描述。相信每一個面試的人都會被詳細問到自己最近做的一個專案,這個時候專案業務和技術架構、業務和技術亮點以及業務和技術不足都要思考清楚,包括日後的優化方向,這樣即使考官問到也能清晰應答。

3.tomcat優化,cpu高定位解決

       這兩塊的優化應該是專案實踐經常會碰到的問題,tomcat的優化我個人的認知應該在一下幾個方面:1)初始引數如permsize、maxpermsize的設定 2)io方式如IO、NIO的切換,這個根絕業務複雜度可以調整  3)作業系統的選擇  4)容器內部的優化,如最大最小執行緒數等。cpu高定位我覺得主要是在於問題排查的過程,個人解決流程如下:1)top命令找出使用率高的程序 2)找出程序對應使用率高的執行緒   3)執行緒列印堆疊找出有問題業務程式碼並解決   4)如以上流程走完沒有問題,應該考慮業務能力與實際伺服器配置是否匹配,當然這個一開始就應該有個考量的。

4.資料庫壓力大處理慢定位問題(建表不當,索引,分表,分庫,讀寫分離,複雜業務sql)

        資料庫壓力大這個可能實際的情況各有差異,我僅描述自己能想到的,碰到此類問題會從以下方面排查:1)伺服器配置與資料量是否匹配  2)建表是否合理,有沒有應該在一個表的資訊被拆分到多個表導致不必要的多次查詢或者連表查詢   3)sql層面有沒有複雜的業務摻入,如果有是否能將複雜sql的複雜度往上剝離到業務程式碼層面,避免資料庫的複雜運算  5)有沒有結果集可以利用快取機制的,從而降低資料庫的訪問量  5)單表或者單庫的資料量是否過大,如果過大考慮分表或者分庫,當然這會涉及到資料遷移、路由等問題,應該是在前幾條處理完仍不能解決問題的情況下考慮  6)其它因素,如無用的或者惡意的請求增加伺服器壓力。

5.負載均衡除了掛載vip還有其它解決方案

        提到負載均衡我想我們大部分的第一反應就是LVS和Nginx等vip性質的架構方案,但被問到其它方案時,我細想好久出了一個業務層面的負載優化,也就是業務的垂直拆分,在一定程度上起到分流的作用,雷同的微服務也應該算。後來想想,zookeeper的思想也是可以被借鑑的,利用註冊中心來管理域名和伺服器的關聯和分配,算是軟負載了吧。還有能想到的就是利用DNS進行負載。遺憾的是我當時就想到了業務垂直拆分。除了以上提到的如果還有其它的思維歡迎賜教。

6.cookie與session差異,如何實現session超時失效(分散式session)

        這個問題是一個非常常見的問題,看似也挺簡單,原理基本都懂,一般的大家能想到的分散式就是利用快取,超時就用快取失效,或者實現一個定時迴圈佇列,不停的輪詢列表處理超時session,記得當時自己也是這麼回答的。後來仔細想想,這種思維是不是太單一了,現在很多的分散式開源框架中用註冊中心剝離的思維不也是可以借鑑的嗎,對於實時要求高的場景可以設計一個定時任務中心,由它主動對超時的session進行失效處理,既能被多方共享也能提高可用性。

7.設計模式(策略,單例,享元,裝飾,代理<jdk和cglib>,工廠)

        設計模式是各種開源框架和jdk裡常見的,也是一種非常好的思想,能在專案中加以恰當的實用肯定是能提升bige和程式碼質量的,面聊中我就自己用到的集中設計模式結合專案加以描述,這個也沒有什麼好過多論述的,需要的話度娘裡各種經典解析均有。

8.spring原始碼研究過哪一塊(aop,ioc...)

        原始碼的研究是很多面試官喜歡問到的,喜歡研究原始碼的人特別是參與原始碼開發的人肯定是被加分的。可惜的是我研究的原始碼並不多,所以也就只能簡單就aop裡面的代理和實現思想進行了下分析,沒研究過要想分析出其底層精華也確非易事,這個得補。

9.有沒有研究過其它開源的原始碼,並自己用過

開放性題目,各自不同,因為我研究少也就不多說了,現在正在看dubbo...

10.你遇到過的oom有幾種場景,怎麼解決的

        碰到過的OOM有兩種情況,一種是Tomcat實際初始配置引數不足,直接調參解決掉了,另外一種就是程式碼死迴圈,一次是本地跑出來發現的,另外一次是線上列印堆疊找到的。其它的個人沒有遇到過,這裡也就不強行問度娘羅列了。

11.jvm的瞭解程度

        這一塊應該是每一個java的從業人員都必須瞭解和熟悉的了。記憶體模型、垃圾回收這兩塊是重中之重,我談論的也主要是這兩塊,包括區域劃分、性質垃圾回收全流程等。

12.分散式事務怎麼處理

        事務因為在專案中用到的很少,所以準備確實不充分,當被問到時竟沒有一點頭緒,後來在引導下聊了幾點自己的思路,但現在想想確實水了,自認離7尚有距離啊。後來針對此問題找了資料,常見的大概有以下三種方案:1)基於XA協議的兩階段提交  2)訊息事務+最終一致性   3)TCC程式設計模式,具體實現後面再撰文分析。

13.spring事務機制

        與上題雷同處境,因為沒有分析過所以對底層具體實現講不清楚,知道有兩類:1)程式設計式事務2)宣告式事務,後者用到了AOP的思想,具體底層實現分學習中。

14.執行緒池影響效能的引數有哪些

1)corePoolSize執行緒數(根據IO和CPU的緊密程度變化)2)maximumPoolSize最大執行緒數 3)workQueue任務佇列長度影響 4)keepAliveTime超過預設執行緒數的執行緒空閒情況下存活時間 5)執行緒優先順序設定(根據業務型別調整)6)執行緒池型別  7)建立執行緒池的方式(ThreadPoolExecutor與Executors的差別)。其中1、2、3、4是用ThreadPoolExecutor建立執行緒池時用到的,1、6則是用Executors建立執行緒池時需要注意的,5則是建立執行緒時指定的。高併發量的場景,執行緒池不建議使用 Executors 去建立,而應該通過 ThreadPoolExecutor 的方式,這樣的處理方式更加明確執行緒池的執行規則,規避資源耗盡的風險。

說明: Executors 返回的執行緒池物件的弊端如下:
a) FixedThreadPoolSingleThreadPool:
允許的請求佇列長度為 Integer.MAX_VALUE,可能會堆積大量的請求,從而導致 OOM。
b) CachedThreadPool 和 ScheduledThreadPool:
允許的建立執行緒數量為 Integer.MAX_VALUE, 可能會建立大量的執行緒,從而導致 OOM。 

15.阿里的tddl和hsf能用開源框架自己搭嗎

        阿里的中介軟體很多都是有開源中介軟體可替代,當時自己瞭解不多,只是分析了兩者的思想和實現原理,認為有團隊就可以搭建。不過了解下就發現,阿里用的基本外界都有替代品,近來在對比學習tddl和mycat、dubbo和hsf。不管怎樣,能用框架解決業務是一回事,深入分析原始碼和思想能具備獨自開發能力又是另一回事,加油學習吧!

16.一次服務端請求從按下enter開始經歷那些過程,每個過程時間消耗怎麼統計

        我是從網路層、業務層、資料庫這個大的時序來分析的,我理解的是他問的應該不是springMVC的這種請求過程,我分析如下流程:

        域名解析-->tcp三次握手-->https校驗-->vip-->Tomcat容器-->業務層-->資料庫層(快取之類)(完了返回)

        時間統計我是結合平時業務處理經驗按大的範圍網路層、業務層、資料庫來統計,方法如下:

       網路層---->ping的方式    業務層---->日誌形式(如AOP等)   資料層---->日誌形式(tddl執行sql日誌,還可以結合binlog日誌)     

17.自己寫部落格嗎,關注別人部落格嗎,關注大資料,區塊鏈,人工智慧嗎

        這個問題也是觸發自己著手寫文章的誘因,寫文章還是很有好處的,既能沉澱知識,以後需要翻起便是,還有可能會有招來橄欖枝,我一朋友就因為喜歡寫技術文章被阿里的招聘同學盯上了,哈哈...

18.還有什麼是你認為很擅長的沒問到的

遺憾沒有就自己不清楚的問題請教考官,以後沒答好的一定要記得反問,就算沒面過最起碼也要有收穫!