1. 程式人生 > 程式設計 >java開發面試問答----分散式篇

java開發面試問答----分散式篇

大流量情況下如何生成唯一id

sequence,雪花演演算法(將64位中的每一段根據時間,區域,機器,序列號組合生成唯一id)

10G整數檔案中尋找中位數或者第K大數

  • 採用基於位元組的桶排序將數字分到不同的桶中,比如找到第k大數,則先找出每個桶中的第k大數,在比較。
  • 整形是4byte,有32位,先按高八位建255個桶
  • 如果記憶體只有2g,則每次讀取2g的資料遍歷放到255個桶中,並統計255個桶的量,2g讀取完後將每個桶的資料匯出到磁碟,迴圈讀完10g資料。
  • 這時根據255個桶的計數計算出中位數在哪個桶,然後開始建後續8位的桶,直到最後低8位也分完,這時候對桶內資料進行快排即可。

如何實現分散式鎖

  • 資料庫樂觀鎖,利用了mysql update行鎖的特點,在每次update前先select出資料然後根據資料的版本進行update,如果版本變了就不更新並把錯誤拋給使用者重試最終達到一致。
  • redis setnx,當該key不存在時就設定value,如果已經存在該key了就直接返回。
  • zookeeper 不能重複建立同一個節點,建立持久結點時需要主動刪除結點釋放,建立臨時結點時斷開連線就會釋放

什麼是分散式系統,分散式原理是什麼

將一個大的系統拆分成多個細小的子系統,子系統之間通過網路通訊的構成的大系統稱為分散式系統。

分散式事務怎麼做

事務有四個特性acid

  • a:原子性,事務中的操作不可分割,要麼一起成功,要麼一起失敗
  • c: 一致性,資料庫中的資料要是完整的,也包含各資源狀態的一致
  • i:隔離性,事務之間要有自己的工作空間,不能相互幹擾
  • d:永續性,事務完成後資料要落盤
  • 資料庫的事務是使用undo和redo日誌做的,undo會記錄未提交操作的資料用來回滾,redo記錄已提交操作的資料落盤。

常用的分散式事務有幾種方式:

  • 2pc,兩階段提交,服務a發prepare請求給協調器,協調器將請求寫到本地日誌,然後傳送prepare給其他各服務,執行者收到請求後執行本地事務,但不會commit,然後將結果返回給協調器,協調器判斷所有的返回如果都成功則讓所有執行者提交commit,如果有失敗的則全部回滾。
  • 訊息表,服務a在發起事務的時候執行本地事務的訊息同時寫入訊息表然後傳送訊息給服務b,服務b在完成本地事務後回訊息給服務a排程器清除訊息表,如果沒有清除,則事務排程器讀取訊息表傳送訊息給服務b,這就需要服務b有冪等性
  • 訊息事務,訊息事務是通過訊息中介軟體實現的類似2pc功能比如rocketmq,服務a提交prepare給mq,然後執行本地事務,如果失敗則回滾,如果成功則確認prepare訊息,mq相當於事務排程器會定期掃描prepare訊息詢問傳送方是否要傳送訊息,而消費方如果失敗則需要一直重試
  • TCC事務補償,先鎖住資源,然後使用鎖住的資源執行業務邏輯,如果失敗則釋放資源,如果成功則落盤。

分散式cap,base理論

分散式系統的cap理論,c一致性,a可用性,p分割槽容錯性,因為網路和機器原因不可控所以p是一定要保障的,大家都知道cap不能同時滿足,所以只能在c和a中選擇,因此有base理論,ba基本可用,s軟狀態(在最終一致前允許存在不一樣的狀態),e最終一致

zookeeper

使用場景

  • 配置管理,由於強一致性,可以存放叢集配置
  • 叢集管理,有新機器加入時在指定目錄建立臨時znode,然後叢集所有機器對目錄建立watch,當有機器斷連時臨時znode會自動刪除,叢集機器收到通知
  • 分散式鎖,叢集機器同時建立znode,建立成功的搶到鎖,zonde刪除釋放鎖
  • 佇列,採用編號znode,按照編號順序依次執行

叢集

叢集中有三種角色,leader,follower和observer,leader負責寫操作,保證叢集事務的順序性,follower參與選舉,observer負責讀操作。只有當叢集初始化和領導者失去多數派支援時會發生領導者選舉。

原理

zookeeper的核心是原子廣播,採用zab協議,主要有恢復模式(選主)和廣播模式(同步)

選主

  • fastleaderselection演演算法的實現是為了省略預提案的過程第一次都是推選自己當leader,將所有接受的提案和自己相比較
    • 當前server發起選舉執行緒,向所有server詢問獲取對方提供的(myid,zxid),myid是zookeeper的編號,zxid是一個64位的數,高32位是選舉週期,每選舉一次加1用來標識是哪個leader的統治時期,低32位是當前週期中的事務順序id。選舉執行緒比較zxid和myid,先選zxid最大的,如果zxid相等再選myid最大的。

paxos原理

兩階段投票,選舉過程主要有提案者和決策者兩種角色。第一階段提案者確定要提案的內容,第二階段進行選舉。

  • 第一階段,提案者向決策者發起預提案,如果決策者沒有接收其他提案,則表示接收該提案,如果已接收其他提案則比較提案的id,如果新的提案id大,則表示接收新的提案否則返回已接受提案的id和value。提案者接收到決策者的返回確定下一階段要提案的id和value。
  • 第二階段,提案者使用確定的提案id和value發起提案,決策者接受提案,如果決策者已經接受了其他提案,則返回已接受提案的id和value,提案者統計結果,如果提案value贊同數沒達到一半以上則增長提案id,重新發起第一階段。