開發與維運

Java經典面試題整理及答案詳解(九)

瞭解更多:
Java經典面試題整理及答案詳解(一)
Java經典面試題整理及答案詳解(二)
Java經典面試題整理及答案詳解(三)
Java經典面試題整理及答案詳解(四)
Java經典面試題整理及答案詳解(五)
Java經典面試題整理及答案詳解(六)
Java經典面試題整理及答案詳解(七)
Java經典面試題整理及答案詳解(八)

本節小編整理了系統架構及項目設計相關的面試題,此類面試題往往考查的是求職者的知識面,所以大家平時要多注意積累,今天小編整理的這15個面試題大家可得掌握呦~

1.MVC模式中,各個層級的職能劃分,哪些功能寫在哪塊?

所謂的MVC設計模式實際上是一種思想,雖然從整體上來說分為了三層,但實際上裡面會劃分了許多層。

image.png

比如有一個業務的完成,要分很多步,我們是把這些步驟放在業務層還是Servlet中?
服務層是可以單獨抽取出來的,你的一個項目要充分的考慮到可擴展性,那麼絕對需要將業務層單獨抽取出來實現RPC調用。
一定要清楚的是控制層不負責任何數據庫的操作,控制層只有一個功能就是調用業務層,業務的方法只有一個,如果業務操作要返回多個內容,那麼就使用Map集合返回。
控制層一定要處理所有的錯誤操作,如果不處理,你可以直接選擇一個拋出,而後在整個的web.xml文件裡面配置一個錯誤頁,這個錯誤頁只要是產生了5xx異常,就自動跳轉到一個錯誤頁上顯示。

image.png
image.png

只有把單機的MVC徹底弄清楚後才有可能牽扯到更多實際開發問題,而集群的開發也只是一種擴展。

2.SSO的處理流程

所謂單點登錄用在什麼場景上?

image.png

CAS有一個自己的流程。

image.png

這個流程最麻煩的就是CAS服務器的配置,因為版本區別很大,所以建議大家使用穩定版本開發。同時還需要對源代碼進行大量的修改與配置才可以得來。

3.關於讀、寫性能

數據庫的讀、寫分離。此種考慮需要根據你的實際業務需求,不能憑空設計。
有這樣一個簡單的架構:
信息的彙總表,同時為了保證查詢性能,需要增加索引,但這張表平均每1秒要更新1000次,但這樣就和索引產生了衝突,所以定義兩張表,一張表作為更新使用,另外一張表在系統安靜下來之後進行差異的備份,而後進行數據的保存。
以上是WEB2.0以前的概念,從WEB2.0時代開始,數據量開始暴增,於是你的老闆可能就要求你對系統進行大規模的升級,要求保證更新速度,要求保證實時性,要求保證數據的有效性。
如果這個時候的設計還是圍繞著傳統的關係型數據庫展開,那麼你的設計一定是失敗的。

image.png

4.分佈式鎖

分佈式鎖指的是在高併發訪問的情況下使用的一種技術,所謂的高併發訪問就是指多個線程對象,為了保證資源的操作完成性而實現的一種技術,這樣的技術可以簡單的理解為鎖。
如果現在多個線程在同一個虛擬機之中,正常編寫一個程序,而後這個程序裡面產生了若干個線程,並且這些線程要操作同一資源。在這樣的情況下,為了保證資源操作的同步最簡單的處理模式就是採用synchronized關鍵字來完成。
但是這樣的做法只適合單JVM運行的情況,而如果現在劃分到網絡上。

範例:JVM鎖

image.png
image.png
image.png
image.png

如果是多虛擬機的狀態下,這樣的設計就必須做出更改了。

image.png

5.項目的負載均衡設計

對於項目的開發需要考慮幾個核心問題:高可用(主備關係)、高併發(可以承受大併發用戶訪問)、分佈式。真正做到這個層次的架構,你的系統平均每天的訪問量不可能低於500W用戶,如果沒有到這個量級,基本上可以肯定用這樣的架構會造成大量額外的硬件成本(雲服務器等)。
在正規的項目開發過程之中,肯定會有專業的前端開發者,這類人員會使用ES6.0標準進行前端開發,例如:JQuery、Vue.JS、React等,所以對於這部分的設計暫時不做考慮。

image.png

在整體的設計過程之中,就必須考慮性能的均衡,當然服務器的選擇和你要使用的技術選擇,也需要根據實際情況來確定,根據併發訪問人數來決定你的技術架構。

6.複雜度

評價一個項目的好與壞,有一個最簡單的標準:時間複雜度和空間複雜度。
時間複雜度指的是你的處理邏輯非常複雜,例如:遞歸、循環結構複雜。複雜度直接的影響就是你的CPU的佔用率高。
空間複雜度指的是你的佔用內存大,例如:在JDBC進行數據查詢的時候實際上會出現一個問題,假設你的數據庫裡有1000W條數據,沒有使用分頁,那麼這些記錄都將加載到內存之中,所以內存佔用率就會很高。假設數據會佔用20G內存,你的一個服務器一定需要為上萬人服務,那麼這個時候佔用的內存就會非常龐大,你的服務器根本就無法進行處理。
對於空間複雜度的操作處理,是需要通過最簡單的分頁算法實現約定,對於時間複雜度,太複雜的邏輯運算,往往不會在一臺服務器上進行,需要設計多臺的開發服務器。

7.紅綠燈系統設計

當面試公司問到這道問題,實際考慮的是你的邏輯分析能力。因為這種開發的操作從現實來看都是通過硬件模擬的,如果非要通過軟件模擬,就需要準備好可能使用到的技術:
(1)Java編寫:Graphics類進行繪製開發;
(2)WEB編寫:HTML5中提供的Canvas進行編寫。
面對此類的問題一定要有一個假設前提:
(1)是否需要有黃燈的緩衝,緩衝的變更時間;
(2)是否需要智能調整,如果發現車流量較大,則適當延遲通過時間;
(3)對於違規車輛的監控情況;
(4)還可能考慮轉向燈的設計。
實現整個操作的技術環節:
(1)定時器:Timer、TimerTask,這兩個類需要時鐘的支持,而且不準,如果要準確則需要使用QuartZ這個組件完成;
(2)描述所有的燈的變化,一定需要有一個線程的同步處理機制、synchronized、使用單例實現;
(3)既然有兩組燈,就建議設計一個單獨紅綠燈類,這個類可以使用一些參數變化完成,例如:
控制變量=0,表示紅燈;
控制變量=1,表示綠燈;
控制變量=2,表示轉向燈;
控制變量=3,表示黃燈(綠燈變為轉向燈);
控制變量=4,表示黃燈(轉向燈變為紅燈);

如果你現在只是希望給出一組狀態,實際上就可以設置一下幾位:111,可以描述7個值。
如果要編寫還需要考慮傳感器問題:包括監控傳感器、流量傳感器。
既然已經有了各種傳感器,那麼就可以再設置幾個傳感器:車速傳感器,可以進行大數據的彙總,計算平均的車速,好為城市的交通規劃做出數據的貢獻。

開發流程:
(1)需要先實現定時進行燈的切換處理,如果你需要程序編寫,如果使用無界面編寫,這個輸出的信息就非常麻煩了;
(2)需要考慮監控的問題,如果只是在軟件上模擬,可以設置幾個座標點,而真實的環境需要有傳感器;
(3)考慮數據的分析問題,可以對相應數據進行採集與彙總。

8.項目中的人員安排

任何一個技術型的公司裡面都可能有若干個開發團隊,每個團隊的開發人數基本上就在3~6人之間,每個團隊都有1個架構師(寫代碼),而且每一個團隊對應的是一個具體的業務。在團隊裡面有3個開發,1個美工,這些是一個正規的開發團隊的組成,所有的團隊都會有項目經理存在。也要一部分公司全部請的都是架構師,這些架構師自己直接實現代碼,這一類的人群技術要求是比較高的。在整個的項目裡面還會有一些輔助人員:系統測試、支撐的人員,這些就屬於項目的維護人員。
如果你想要從事軟件行業,那麼最好的做法是不去做這些輔助的工作,而直接上手開發,這樣對你日後的發展是非常有幫助的。從最初的全棧工程師,到現在強調的是開發+運維,那麼以後是全員架構時代,所有的開發人員一定都是能獨當一面的高手。這類人的工資很高,但對於整個企業運行來講,這樣的成本是最低的。以後的開發之路:懂架構有未來。

9.密碼加密處理

加密往往都會存在一種解密程序。
毒蛇出入七步之內必有解藥。
最簡單的加密:
(1)你的原始密碼:abc;
(2)加密:cba;
如果所有的人都知道有這樣的密碼結構,那麼就可以很輕鬆的破解了,可是如果你在裡面追加一些內容。

你的原始密碼:abc;
鹽值:-
新密碼:c-b-a-;

如果按照原始規則,那麼現在就無法得到正確的原始密碼。也就是說鹽值是讓整個密碼看起來更加安全。
MD5的結構特徵是不可逆,但是慢慢使用的時間長了,有些人就開始找到了一些規律,為了不讓這些人破解密碼,那麼就在生成密碼的時候增加一些額外的內容,這樣的內容就是鹽值,這樣就可以避免這些人來破壞。不同的項目使用不同的鹽值來進行處理。

10.商品秒殺設計方案

如果要進行商品秒殺操作一定要有一個前提:預估數據量。
小米進行搶購的時候都需要針對數據量進行預估:所有的人需要報名參加搶購;
淘寶或京東搶購的時候發現缺少報名,原因是它們是依靠大數據分析系統得來的預估數據量;

如果沒有預估數據量,那麼整個系統的先期準備就會不足。如果要進行秒殺操作,可以設計以下的流程:
(1)用戶進行秒殺的登記;
(2)時間一到開始進行秒殺操作;
(3)在秒殺操作的過程中需要出現一個等待界面,如果此界面刷新了則搶購失敗。

image.png

11.日誌輸出

在一般的系統開發裡面,對於一些調試的數據都很少使用System.out進行輸出,幾乎都會配置Log4j開發包,這個開發並不複雜,你只需要配置上開發包,而後Logger類就可以使用了。
裡面分為幾種級別:info()、error()、wraning(),如果出現了異常一定使用的是error()。
之所以使用log4j輸出,主要是方便進行調整。日誌是我們解決問題的關鍵,所有的日誌都應該輸出到一個指定的目錄之中,這樣的配置都是固定的,不需要做特別的處理。
需要的就是配置log4j、slf4j這樣的開發包就可以使用日誌輸出了。

12.企業項目部署

實際的環境架構設計,必須要充分的考慮到你的業務需求以及所謂的高峰訪問的情況。假如說你有一個系統,一年有10個人訪問,那麼就不需要去搞架構了。
如果要進行架構設計,必須考慮以下幾點:
(1)該架構能否動態擴容;
(2)該架構能否支撐HA機制;
(3)該架構是否長期有效。

image.png

以上的集群設計是為了考慮性能平衡,但是會有一個問題存在:沒有考慮到HA機制,如果考慮到高可用機制還需要追加更多的協助主機,這些主機將作為備選使用。

13.實際的項目開發

在實際的項目開發過程中,只有一點是確定的,就是Tomcat裡面是沒有數據庫的。
如果要進行實際的項目開發,往往需要有許多的子系統。現在的開發領域經常出現一個概念:微架構。這種微架構的設計是有兩種開發技術:Duubo、SpringColud。
如果要是將項目進行子系統的規劃設計,所有的子系統裡面包含的就是所有的業務層接口以及數據層的接口。

image.png

如果你做的是一些基礎開發,那麼對於整個的開發技術而言,你只需要一個數據庫實現數據即可。當然還要考慮庫表分離的問題,所有的數據庫不可能無限制的讓數據增長。

14.數據庫優化

數據庫本身是存儲結構數據的,數據庫優化指的是傳統的關係型數據庫操作,數據庫的優化有以下幾個使用原則:
(1)需要有一個非常專業的DBA,可以根據你的服務器的配置調整你的數據庫的運行環境;
(2)數據庫需要選擇合適的操作系統才可以發揮優勢;
(3)保證你的查詢語句不會寫的特別荒唐,例如你大量的採用了多表查詢,在高併發的情況下依然採用同樣的方式進行;
(4)可以將部分的數據靜態化到緩存之中,例如學校、城市、姓名基本不會發生什麼變化;

如果以上的要求都做到了,數據庫的操作依然很慢,那麼就有可能是數據量太大的原因了,此時無論你再如何進行優化,你的數據庫的操作也不可能得到質的提升,這個時候就必須做先期的項目預估,這個預估的時候就需要考慮進行庫表分離的有效設計:
(1)數據的分片保存(數據備份問題,一主多從的備份);
(2)數據的讀寫分離;

如果從程序本身的角度來講,每一個用戶的請求一定要及時的關閉好數據庫的連接,不要打開過多的無效連接,以及在項目之中應該配置數據源。

15.項目闡述

(1)項目實際上沒有大小之分,有的只是你的業務邏輯是否清楚。
在你進行項目設計的時候應該更清楚這個項目設計的業務是否合理,可以對某一個項目進行一些頭腦風暴擴充;
(2)項目的解釋必須要有一個原則:你的項目的使用環境、預估的訪問人數、以及併發量;
(3)項目的開發技術,如果是單節點的開發技術,只需要傳統的技術名詞;
(4)如果你的項目設計的架構比價複雜,使用的服務節點比較多,這個時候你就需要清楚這些節點的作用、這些服務節點的安全處理你是如何進行的、節點間的數據互相同步處理;
(5)描述這個項目之中具備有多少個模塊,完成的週期;
(6)你做了哪些項目,這些項目裡面具體的業務是什麼。

更多專業知識,面試技巧就在面試一點通,持續更新中……
感謝瀏覽~
本內容來源於阿里雲大學-Java面試技巧

Leave a Reply

Your email address will not be published. Required fields are marked *