2019螞蟻金服Java必問面試題(二面)

2019螞蟻金服Java必問面試題(二面)
二面

你有什麼問題想問我的嗎?

1、自我介紹、工作經歷、技術棧

2、項目中你學到了什麼技術?

3、微服務劃分的粒度?

4、微服務的高可用怎麼保證的?

負載均衡與反向代理,隔離,限流,降級,超時與重試,回滾,壓力測試與應急預案

5、常用的負載均衡,該怎麼用,你能說下嗎?

(1)http重定向

當http代理(比如瀏覽器)向web服務器請求某個URL後,web服務器可以通過http響應頭信息中的Location標記來返回一個新的URL。這意味着HTTP代理需要繼續請求這個新的URL,完成自動跳轉。

(2)DNS負載均衡

DNS 負責提供域名解析服務,當訪問某個站點時,實際上首先需要通過該站點域名的DNS服務器來獲取域名指向的IP地址,在這一過程中,DNS服務器完成了域名到IP地址的映射,同樣,這樣映射也可以是一對多的,這時候,DNS服務器便充當了負載均衡調度器,它就像http重定向轉換策略一樣,將用戶的請求分散到多臺服務器上,但是它的實現機制完全不同。

(3)IP負載均衡(LVS-NAT)

因爲反向代理服務器工作在HTTP層,其本身的開銷就已經嚴重製約了可擴展性,從而也限制了它的性能極限。那能否在HTTP層面以下實現負載均衡呢?

NAT服務器:它工作在傳輸層,它可以修改發送來的IP數據包,將數據包的目標地址修改爲實際服務器地址

(4)直接路由(LVS-DR)

NAT是工作在網絡分層模型的傳輸層(第四層),而直接路由是工作在數據鏈路層(第二層),貌似更屌些。它通過修改數據包的目標MAC地址(沒有修改目標IP),將數據包轉發到實際服務器上,不同的是,實際服務器的響應數據包將直接發送給客戶羰,而不經過調度器

(5)IP隧道(LVS-TUN)

基於IP隧道的請求轉發機制:將調度器收到的IP數據包封裝在一個新的IP數據包中,轉交給實際服務器,然後實際服務器的響應數據包可以直接到達用戶端。目前Linux大多支持,可以用LVS來實現,稱爲LVS-TUN,與LVS-DR不同的是,實際服務器可以和調度器不在同一個WANt網段,調度器通過 IP隧道技術來轉發請求到實際服務器,所以實際服務器也必須擁有合法的IP地址。

總體來說,LVS-DR和LVS-TUN都適合響應和請求不對稱的Web服務器,如何從它們中做出選擇,取決於你的網絡部署需要,因爲LVS-TUN可以將實際服務器根據需要部署在不同的地域,並且根據就近訪問的原則來轉移請求,所以有類似這種需求的,就應該選擇LVS-TUN。

6、網關能夠爲後端服務帶來哪些好處?

後端服務器可以專心處理業務請求,節省了大量連接管理的開銷

7、對象比較是否相同

equals通常用來比較兩個對象的內容是否相等,==用來比較兩個對象的地址是否相等

8、hashmap put 方法存放的時候怎麼判斷是否是重複的

先比較key的hashCode,再比較相等或equals的,所以重寫hashCode()和equals()方法即可實現添加重複元素。

9、Set 和 List 區別?

Set(集):集合中的對象不按特定方式排序,並且沒有重複對象。它的有些實現類能對集合中的對象按特定方式排序。

List(列表):集合中的對象按索引位置排序,可以有重複對象,允許按照對象在集合中的索引位置檢索對象。

10、ArrayList 和 LinkedList 區別

ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構

ArrayList 繼承AbstractList

LinkedList 繼承AbstractSequentialList

ArrayList 採用的是數組形式來保存對象的,這種方式將對象放在連續的位置中,所以最大的缺點就是插入刪除時非常麻煩

LinkedList 採用的將對象存放在獨立的空間中,而且在每個空間中還保存下一個鏈接的索引 但是缺點就是查找非常麻煩 要叢第一個索引開始

11、如果存取相同的數據,ArrayList 和 LinkedList 誰佔用空間更大?

對於隨機訪問get和set,ArrayList覺得優於LinkedList,因爲LinkedList要移動指針

對於新增和刪除操作add和remove,LinedList比較佔優勢,因爲ArrayList要移動數據,若要從數組中刪除或插入某一個對象,需要移動後段的數組元素,從而會重新調整索引順序,調整索引順序會消耗一定的時間,相反,LinkedList是使用鏈表實現的,若要從鏈表中刪除或插入某一個對象,只需要改變前後對象的引用即可

12、HashTable 你瞭解過嗎?

Hashtable既不支持Null key也不支持Null value。Hashtable的put()方法的註釋中有說明Hashtable是線程安全的,

Hashtable是線程安全的,它的每個方法中都加入了Synchronize方法,效率比較低

Hashtable默認的初始大小爲11,之後每次擴充,容量變爲原來的2n+1。

Hashtable在計算元素的位置時需要進行一次除法運算,而除法運算是比較耗時的。

13、synchronized、lock

synchronized是java中的一個關鍵字,也就是說是Java語言內置的特性

如果一個代碼塊被synchronized修飾了,當一個線程獲取了對應的鎖,並執行該代碼塊時,其他線程便只能一直等待,等待獲取鎖的線程釋放鎖,而這裏獲取鎖的線程釋放鎖只會有兩種情況:

1)獲取鎖的線程執行完了該代碼塊,然後線程釋放對鎖的佔有;

2)線程執行發生異常,此時JVM會讓線程自動釋放鎖

那麼如果這個獲取鎖的線程由於要等待IO或者其他原因(比如調用sleep方法)被阻塞了,但是又沒有釋放鎖,其他線程便只能乾巴巴地等待,試想一下,這多麼影響程序執行效率。

因此就需要有一種機制可以不讓等待的線程一直無期限地等待下去(比如只等待一定的時間或者能夠響應中斷),通過Lock就可以辦到。

再舉個例子:當有多個線程讀寫文件時,讀操作和寫操作會發生衝突現象,寫操作和寫操作會發生衝突現象,但是讀操作和讀操作不會發生衝突現象。

但是採用synchronized關鍵字來實現同步的話,就會導致一個問題:

如果多個線程都只是進行讀操作,所以當一個線程在進行讀操作時,其他線程只能等待無法進行讀操作。

因此就需要一種機制來使得多個線程都只是進行讀操作時,線程之間不會發生衝突,通過Lock就可以辦到。

另外,通過Lock可以知道線程有沒有成功獲取到鎖。這個是synchronized無法辦到的

14、cas 操作

java.util.concurrent包中藉助CAS實現了區別於synchronized同步鎖的一種樂觀鎖

cas是比較並交換算法

CAS有3個操作數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改爲B,否則什麼都不做

JDK提供了AtomicReference類來保證引用對象之間的原子性,就可以把多個變量放在一個對象裏來進行CAS操作。

15、lock 和 synchronized 的區別?

(1)Lock是一個接口,而synchronized是Java中的關鍵字,synchronized是內置的語言實現;

(2)synchronized在發生異常時,會自動釋放線程佔有的鎖,因此不會導致死鎖現象發生;而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時需要在finally塊中釋放鎖;

(3)Lock可以讓等待鎖的線程響應中斷,而synchronized卻不行,使用synchronized時,等待的線程會一直等待下去,不能夠響應中斷;

(4)通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。

(5)Lock可以提高多個線程進行讀操作的效率。

在性能上來說,如果競爭資源不激烈,兩者的性能是差不多的,而當競爭資源非常激烈時(即有大量線程同時競爭),此時Lock的性能要遠遠優於synchronized。所以說,在具體使用時要根據適當情況選擇。

16、公平鎖和非公平鎖

公平和非公平鎖的隊列都基於鎖內部維護的一個雙向鏈表,表結點Node的值就是每一個請求當前鎖的線程。公平鎖則在於每次都是依次從隊首取值

非公平鎖在等待鎖的過程中, 如果有任意新的線程妄圖獲取鎖,都是有很大的機率直接獲取到鎖的

(在ReentrantLock中很明顯可以看到其中同步包括兩種,分別是公平的FairSync和非公平的NonfairSync。公平鎖的作用就是嚴格按照線程啓動的順序來執行的,不允許其他線程插隊執行的;而非公平鎖是允許插隊的。

默認情況下ReentrantLock是通過非公平鎖來進行同步的,包括synchronized關鍵字都是如此,因爲這樣性能會更好。因爲從線程進入了RUNNABLE狀態,可以執行開始,到實際線程執行是要比較久的時間的。而且,在一個鎖釋放之後,其他的線程會需要重新來獲取鎖。其中經歷了持有鎖的線程釋放鎖,其他線程從掛起恢復到RUNNABLE狀態,其他線程請求鎖,獲得鎖,線程執行,這一系列步驟。如果這個時候,存在一個線程直接請求鎖,可能就避開掛起到恢復RUNNABLE狀態的這段消耗,所以性能更優化)

17、讀寫鎖設計主要解決什麼問題?

多線程,

讀操作可以共享,寫操作是排他的,讀可以有多個在讀,寫只有唯一個在寫,同時寫的時候不允許讀

解決了讀和讀可以同時進行,讀和寫不能同時進行,寫和寫不能同時進行

18、MySQL 分頁查詢語句

LIMIT [offset,] rows

offset指定要返回的第一行的偏移量,rows第二個指定返回行的最大數目

19、MySQL 事務特性和隔離級別

事務的基本要素(ACID)

(1)原子性(Atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。

(2)一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。比如A向B轉賬,不可能A扣了錢,B卻沒收到。

(3)隔離性(Isolation):同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。

(4)持久性(Durability):事務完成後,事務對數據庫的所有更新將被保存到數據庫,不能回滾。

20、事務的併發問題

(1)髒讀:事務A讀取了事務B更新的數據,然後B回滾操作,那麼A讀取到的數據是髒數據

(2)不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果 不一致。

(3)幻讀:系統管理員A將數據庫中所有學生的成績從具體分數改爲ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

21、sql having 的使用場景

如果需要對組函數的結果作爲條件,那麼不能使用where子句,必須使用having子句

22、前端瀏覽器地址的一個 http 請求到後端整個流程是怎麼樣?

能夠說下嗎?

域名解析 --> 發起TCP的3次握手 --> 建立TCP連接後發起http請求 -->服務器響應http請求,瀏覽器得到html代碼 -->瀏覽器解析html代碼,並請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給用戶

23、http 默認端口,https 默認端口

HTTP協議代理服務器常用端口號:80/8080/3128/8081/9080

HTTPS服務器,默認的端口號爲443/tcp 443/udp

24、DNS 你知道是幹嘛的嗎?

DNS是指:域名服務器(Domain Name Server)。在Internet上域名與IP地址之間是一一對應的,域名雖然便於人們記憶,但機器之間只能互相認識IP地址,它們之間的轉換工作稱爲域名解析,域名解析需要由專門的域名解析服務器來完成,DNS就是進行域名解析的服務器

完整面試題文檔獲取、最新精選錄播、Java資料、學習導圖免費提供給年後想要跳槽或想升職加薪的程序員,加微信13272413561備註資料即可免費獲取哦
2019螞蟻金服Java必問面試題(二面)
2019螞蟻金服Java必問面試題(二面)
2019螞蟻金服Java必問面試題(二面)
2019螞蟻金服Java必問面試題(二面)
2019螞蟻金服Java必問面試題(二面)
2019螞蟻金服Java必問面試題(二面)
獲取方式:
https://shimo.im/docs/TC9Jq63Tp6HvTXdg/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章