谷歌十年掃地僧帶你學「三高!」:高並行+高效能+高可用

2020-10-19 10:00:23

前言

很多人做java開發2至3年後,都會感覺自己遇到瓶頸。什麼都會又什麼都不會,如何改變困境,為什麼很多人寫了7,8年還是一個碼農,工作中太多被動是因為不懂底層原理。公司的工作節奏又比較快,難有機會學習架構原理,也沒人教,所以這個時候,學習架構原理,擴充套件思維,對自己以後職業生涯尤為重要。

同樣公司的兩個新人,一個新人一點就通,學東西很快,有的人,學東西很慢,也很痛苦,處處都是新技術。為什麼?因為那個人懂原理,萬物都有規律,掌握了規律學其他東西原理相通,一觸就會,不懂原理就會處處碰壁,學習很慢還很折磨。

很多程式設計師會有一個苦惱,工作了很久,在公司一味的增刪改查,得不到技術的提高,無緣底層程式碼,只會用不知其原理!

正值跳槽季,有越來越多的人感覺自己以前引以為傲的技術水準已經不夠用了,一去面試就是問底層,一面試就是問原理。哪怕你實戰能力再強,不懂底層原理也只是一個會機械堆程式碼的高階碼農,現今網際網路企業需要的卻是能夠不斷創新,有想法的人。

 

Java架構系列面試題:高並行+高效能+高可用

1、現在有T1、T2、T3三個執行緒,你怎樣保證T2在T1執行完後執行,T3在T2執行完後執行?

這個執行緒問題通常會在第一輪或電話面試階段被問到,目的是檢測你對」join」方法是否熟悉。這個多執行緒問題比較簡單,可以用join方法實現。

2、在Java中Lock介面比synchronized塊的優勢是什麼?你需要實現一個高效的快取,它允許多個使用者讀,但只允許一個使用者寫,以此來保持它的完整性,你會怎樣去實現它?

3、在java中wait和sleep方法的不同?

通常會在電話面試中經常被問到的Java執行緒面試問題。最大的不同是在等待時wait會釋放鎖,而sleep一直持有鎖。Wait通常被用於執行緒間互動,sleep通常被用於暫停執行。

4、BIO、NIO和AIO的區別?

BIO:一個連線一個執行緒,使用者端有連線請求時伺服器端就需要啟動一個執行緒進行處理。執行緒開銷大。

偽非同步IO:將請求連線放入執行緒池,一對多,但執行緒還是很寶貴的資源。

NIO:一個請求一個執行緒,但使用者端傳送的連線請求都會註冊到多路複用器上,多路複用器輪詢到連線有I/O請求時才啟動一個執行緒進行處理。

AIO:一個有效請求一個執行緒,使用者端的I/O請求都是由OS先完成了再通知伺服器應用去啟動執行緒進行處理,

BIO是面向流的,NIO是面向緩衝區的;BIO的各種流是阻塞的。而NIO是非阻塞的;BIO的Stream是單向的,而NIO的channel是雙向的。

NIO的特點:事件驅動模型、單執行緒處理多工、非阻塞I/O,I/O讀寫不再阻塞,而是返回0、基於block的傳輸比基於流的傳輸更高效、更高階的IO函數zero-copy、IO多路複用大大提高了Java網路應用的可伸縮性和實用性。基於Reactor執行緒模型。

在Reactor模式中,事件分發器等待某個事件或者可應用或個操作的狀態發生,事件分發器就把這個事件傳給事先註冊的事件處理常式或者回撥函數,由後者來做實際的讀寫操作。如在Reactor中實現讀:註冊讀就緒事件和相應的事件處理器、事件分發器等待事件、事件到來,啟用分發器,分發器呼叫事件對應的處理器、事件處理器完成實際的讀操作,處理讀到的資料,註冊新的事件,然後返還控制權。

5、NIO的組成?

6、Netty的特點?

7、Netty的執行緒模型?

8、dubbo服務負載均衡策略?

l Random LoadBalance

隨機,按權重設定隨機概率。在一個截面上碰撞的概率高,但呼叫量越大分佈越均勻,而且按概率使用權重後也比較均勻,有利於動態調整提供者權重。(權重可以在dubbo管控臺設定)

l RoundRobin LoadBalance

輪循,按公約後的權重設定輪循比率。存在慢的提供者累積請求問題,比如:第二臺機器很慢,但沒掛,當請求調到第二臺時就卡在那,久而久之,所有請求都卡在調到第二臺上。

l LeastActive LoadBalance

最少活躍呼叫數,相同活躍數的隨機,活躍數指呼叫前後計數差。使慢的提供者收到更少請求,因為越慢的提供者的呼叫前後計數差會越大。

l ConsistentHash LoadBalance

一致性Hash,相同引數的請求總是發到同一提供者。當某一臺提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動。預設只對第一個引數Hash,如果要修改,請設定

9、什麼是Redis?

10、Redis相比memcached有哪些優勢?

11、Redis支援哪幾種資料型別?

12、Redis主要消耗什麼物理資源?

 

13、什麼是Spring Cloud?

Spring cloud流應用程式啟動器是基於Spring Boot的Spring整合應用程式,提供與外部系統的整合。Spring cloud Task,一個生命週期短暫的微服務架構,用於快速構建執行有限資料處理的應用程式。

14、使用Spring Cloud有什麼優勢?

15、服務註冊和發現是什麼意思?Spring Cloud如何實現?

 

16、什麼是競爭條件?你怎樣發現和解決競爭?

這是一道出現在多執行緒面試的高階階段的問題。大多數的面試官會問最近你遇到的競爭條件,以及你是怎麼解決的。有些時間他們會寫簡單的程式碼,然後讓你檢測出程式碼的競爭條件。可以參考我之前釋出的關於Java競爭條件的文章。在我看來這是最好的java執行緒面試問題之一,它可以確切的檢測候選者解決競爭條件的經驗,or writing code which is free of data race or anyother race condition。關於這方面最好的書是《Concurrency practices in Java》。

17、你將如何使用threaddump?你將如何分析Thread dump?

在UNIX中你可以使用kill -3,然後thread dump將會列印紀錄檔,在windows中你可以使用」CTRL+Break」。非常簡單和專業的執行緒面試問題,但是如果他問你怎樣分析它,就會很棘手。

18、為什麼我們呼叫start()方法時會執行run()方法,為什麼我們不能直接呼叫run()方法?

19、Java中你怎樣喚醒一個阻塞的執行緒?

等等,還有整個系列的面試題及答案,如果需要請一鍵三連後;「加我VX小助理」來免費獲取到!

 

架構師進階之路

最後

最後就是面試題及答案的獲取方式,加我VX小助理,有免費分享的Java架構系列視訊,還有思維導圖,主要分享分散式架構、高可延伸、高效能、高並行、效能優化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分散式專案實戰學習架構師視訊。