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

大流量狀況下如何生成惟一id

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

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 不能重複建立同一個節點,建立持久結點時須要主動刪除結點釋放,建立臨時結點時斷開鏈接就會釋放

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

將一個大的系統拆分紅多個細小的子系統,子系統之間經過網絡通訊的構成的大系統稱爲分佈式系統。node

分佈式事務怎麼作

事務有四個特性acidmysql

  • 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最終一致redis

zookeeper

使用場景

  • 配置管理,因爲強一致性,能夠存放集羣配置
  • 集羣管理,有新機器加入時在指定目錄建立臨時znode,而後集羣全部機器對目錄建立watch,當有機器斷連時臨時znode會自動刪除,集羣機器收到通知
  • 分佈式鎖,集羣機器同時建立znode,建立成功的搶到鎖,zonde刪除釋放鎖
  • 隊列,採用編號znode,按照編號順序依次執行

集羣

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

原理

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

選主

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

paxos原理

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

  • 第一階段,提案者向決策者發起預提案,若是決策者沒有接收其餘提案,則表示接收該提案,若是已接收其餘提案則比較提案的id,若是新的提案id大,則表示接收新的提案不然返回已接受提案的id和value。提案者接收到決策者的返回肯定下一階段要提案的id和value。
  • 第二階段,提案者使用肯定的提案id和value發起提案,決策者接受提案,若是決策者已經接受了其餘提案,則返回已接受提案的id和value,提案者統計結果,若是提案value贊同數沒達到一半以上則增加提案id,從新發起第一階段。
相關文章
相關標籤/搜索