以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,

愛寫代碼的瀟 2021-09-15 05:00:59
商品 redis 分布式 分布 一招


1. 面試官:工作中使用過Zookeeper嘛?你知道它是什麼,有什麼用途呢?

小菜雞的我:

  • 有使用過的,使用ZooKeeper作為dubbo的注册中心,使用ZooKeeper實現分布式鎖
  • ZooKeeper,它是一個開放源碼的分布式協調服務,它是一個集群的管理者,它將簡單易用的接口提供給用戶。
  • 可以基於Zookeeper 實現諸如數據發布/訂閱、負載均衡、命名服務、分布式協調/通知、集群管理、Master 選舉、分布式鎖和分布式隊列等功能
  • Zookeeper的用途:命名服務、配置管理、集群管理、分布式鎖、隊列管理

用途跟功能不是一個意思咩?

2. 面試官:說下什麼是命名服務,什麼是配置管理,又什麼是集群管理吧

小菜雞的我(幸好我刷過面試題),無所畏懼

  • 命名服務就是

    命名服務是指通過指定的名字來獲取資源或者服務地址。Zookeeper可以創建一個全局唯一的路徑,這個路徑就可以作為一個名字。被命名的實體可以是集群中的機器,服務的地址,或者是遠程的對象等。一些分布式服務框架(RPC、RMI)中的服務地址列錶,通過使用命名服務,客戶端應用能够根據特定的名字來獲取資源的實體、服務地址和提供者信息等。

  • 配置管理:

    實際項目開發中,我們經常使用.properties或者xml需要配置很多信息,如數據庫連接信息、fps地址端口等等。因為你的程序一般是分布式部署在不同的機器上(如果你是單機應用當我沒說),如果把程序的這些配置信息保存在zk的znode節點下,當你要修改配置,即znode會發生變化時,可以通過改變zk中某個目錄節點的內容,利用watcher通知給各個客戶端,從而更改配置。

  • 集群管理

    集群管理包括集群監控和集群控制,其實就是監控集群機器狀態,剔除機器和加入機器。zookeeper可以方便集群機器的管理,它可以實時監控znode節點的變化,一旦發現有機器掛了,該機器就會與zk斷開連接,對用的臨時目錄節點會被删除,其他所有機器都收到通知。新機器加入也是類似醬紫,所有機器收到通知:有新兄弟目錄加入啦。

3. 面試官:你提到了znode節點,那你知道znode有幾種類型呢?zookeeper的數據模型是怎樣的呢?

小菜雞的我(我先想想):

zookeeper的數據模型

ZooKeeper的視圖數據結構,很像Unix文件系統,也是樹狀的,這樣可以確定每個路徑都是唯一的。zookeeper的節點統一叫做znode,它是可以通過路徑來標識,結構圖如下:

以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,_Java

znode的4種類型

根據節點的生命周期,znode可以分為4種類型,分別是持久節點(PERSISTENT)、持久順序節點(PERSISTENT_SEQUENTIAL)、臨時節點(EPHEMERAL)、臨時順序節點(EPHEMERAL_SEQUENTIAL)

  • 持久節點(PERSISTENT)

    這類節點被創建後,就會一直存在於Zk服務器上。直到手動删除。

  • 持久順序節點(PERSISTENT_SEQUENTIAL)

    它的基本特性同持久節點,不同在於增加了順序性。父節點會維護一個自增整性數字,用於子節點的創建的先後順序。

  • 臨時節點(EPHEMERAL)

    臨時節點的生命周期與客戶端的會話綁定,一旦客戶端會話失效(非TCP連接斷開),那麼這個節點就會被自動清理掉。zk規定臨時節點只能作為葉子節點。

  • 臨時順序節點(EPHEMERAL_SEQUENTIAL)

    基本特性同臨時節點,添加了順序的特性。

4、面試官:你知道znode節點裏面存儲的是什麼嗎?每個節點的數據最大不能超過多少呢?

小菜雞的我:

以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,_程序員_02

znode節點裏面存儲的是什麼?

Znode數據節點的代碼如下

public class DataNode implements Record {
byte data[];
Long acl;
public StatPersisted stat;
private Set<String> children = null;
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

哈哈,Znode包含了存儲數據、訪問權限、子節點引用、節點狀態信息,如圖:

以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,_Java_03

  • data: znode存儲的業務數據信息
  • ACL: 記錄客戶端對znode節點的訪問權限,如IP等。
  • child: 當前節點的子節點引用
  • stat: 包含Znode節點的狀態信息,比如事務id、版本號、時間戳等等。

每個節點的數據最大不能超過多少呢

為了保證高吞吐和低延遲,以及數據的一致性,znode只適合存儲非常小的數據,不能超過1M,最好都小於1K。

5、面試官:你知道znode節點上的監聽機制嘛?講下Zookeeper watch機制吧。

小菜雞的我:

以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,_Java_04

  • Watcher機制
  • 監聽機制的工作原理
  • Watcher特性總結

Watcher監聽機制

Zookeeper 允許客戶端向服務端的某個Znode注册一個Watcher監聽,當服務端的一些指定事件觸發了這個Watcher,服務端會向指定客戶端發送一個事件通知來實現分布式的通知功能,然後客戶端根據 Watcher通知狀態和事件類型做出業務上的改變。

可以把Watcher理解成客戶端注册在某個Znode上的觸發器,當這個Znode節點發生變化時(增删改查),就會觸發Znode對應的注册事件,注册的客戶端就會收到异步通知,然後做出業務的改變。

Watcher監聽機制的工作原理

以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,_Java_05

  • ZooKeeper的Watcher機制主要包括客戶端線程、客戶端 WatcherManager、Zookeeper服務器三部分。
  • 客戶端向ZooKeeper服務器注册Watcher的同時,會將Watcher對象存儲在客戶端的WatchManager中。
  • 當zookeeper服務器觸發watcher事件後,會向客戶端發送通知, 客戶端線程從 WatcherManager 中取出對應的 Watcher 對象來執行回調邏輯。

Watcher特性總結

  • **一次性:**一個Watch事件是一個一次性的觸發器。一次性觸發,客戶端只會收到一次這樣的信息。
  • 异步的: Zookeeper服務器發送watcher的通知事件到客戶端是异步的,不能期望能够監控到節點每次的變化,Zookeeper只能保證最終的一致性,而無法保證强一致性。
  • 輕量級: Watcher 通知非常簡單,它只是通知發生了事件,而不會傳遞事件對象內容。
  • 客戶端串行: 執行客戶端 Watcher 回調的過程是一個串行同步的過程。
  • 注册 watcher用getData、exists、getChildren方法
  • 觸發 watcher用create、delete、setData方法

6、面試官:你對Zookeeper的數據結構都有一定了解,那你講下Zookeeper的特性吧

小菜雞的我:(我背過書,啊哈哈)

Zookeeper 保證了如下分布式一致性特性:

  • 順序一致性:從同一客戶端發起的事務請求,最終將會嚴格地按照順序被應用到 ZooKeeper 中去。
  • 原子性:所有事務請求的處理結果在整個集群中所有機器上的應用情况是一致的,也就是說,要麼整個集群中所有的機器都成功應用了某一個事務,要麼都沒有應用。
  • 單一視圖:無論客戶端連到哪一個 ZooKeeper 服務器上,其看到的服務端數據模型都是一致的。
  • 可靠性: 一旦服務端成功地應用了一個事務,並完成對客戶端的響應,那麼該事務所引起的服務端狀態變更將會被一直保留下來。
  • 實時性(最終一致性): Zookeeper 僅僅能保證在一定的時間段內,客戶端最終一定能够從服務端上讀取到最新的數據狀態。

7、面試官:你剛提到順序一致性,那zookeeper是如何保證事務的順序一致性的呢?

小菜雞的我:(完蛋了這題不會)

需要了解事務ID,即zxid。ZooKeeper的在選舉時通過比較各結點的zxid和機器ID選出新的主結點的。zxid由Leader節點生成,有新寫入事件時,Leader生成新zxid並隨提案一起廣播,每個結點本地都保存了當前最近一次事務的zxid,zxid是遞增的,所以誰的zxid越大,就錶示誰的數據是最新的。

ZXID的生成規則如下:

以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,_後端_06

ZXID有兩部分組成:

  • 任期:完成本次選舉後,直到下次選舉前,由同一Leader負責協調寫入;
  • 事務計數器:單調遞增,每生效一次寫入,計數器加一。

ZXID的低32比特是計數器,所以同一任期內,ZXID是連續的,每個結點又都保存著自身最新生效的ZXID,通過對比新提案的ZXID與自身最新ZXID是否相差“1”,來保證事務嚴格按照順序生效的。

8、面試官:你提到了Leader,你知道Zookeeper的服務器有幾種角色嘛?Zookeeper下Server工作狀態又有幾種呢?

小菜雞的我:

以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,_後端_07

Zookeeper 服務器角色

Zookeeper集群中,有Leader、Follower和Observer三種角色

Leader

Leader服務器是整個ZooKeeper集群工作機制中的核心,其主要工作:

  • 事務請求的唯一調度和處理者,保證集群事務處理的順序性
  • 集群內部各服務的調度者

Follower

Follower服務器是ZooKeeper集群狀態的跟隨者,其主要工作:

  • 處理客戶端非事務請求,轉發事務請求給Leader服務器
  • 參與事務請求Proposal的投票
  • 參與Leader選舉投票

Observer

Observer是3.3.0 版本開始引入的一個服務器角色,它充當一個觀察者角色——觀察ZooKeeper集群的最新狀態變化並將這些狀態變更同步過來。其工作:

  • 處理客戶端的非事務請求,轉發事務請求給 Leader 服務器
  • 不參與任何形式的投票

Zookeeper下Server工作狀態

服務器具有四種狀態,分別是 LOOKING、FOLLOWING、LEADING、OBSERVING。

  • 1.LOOKING:尋找Leader狀態。當服務器處於該狀態時,它會認為當前集群中沒有 Leader,因此需要進入 Leader 選舉狀態。
  • 2.FOLLOWING:跟隨者狀態。錶明當前服務器角色是Follower。
  • 3.LEADING:領導者狀態。錶明當前服務器角色是Leader。
  • 4.OBSERVING:觀察者狀態。錶明當前服務器角色是Observer。

9、面試官:你說到服務器角色是基於ZooKeeper集群的,那你畫一下ZooKeeper集群部署圖吧?ZooKeeper是如何保證主從節點數據一致性的呢?

小菜雞的我:

以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,_後端_08

ZooKeeper集群部署圖

以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,_Java_09

ZooKeeper集群是一主多從的結構:

  • 如果是寫入數據,先寫入主服務器(主節點),再通知從服務器。
  • 如果是讀取數據,既讀主服務器的,也可以讀從服務器的。

ZooKeeper如何保證主從節點數據一致性

我們知道集群是主從部署結構,要保證主從節點一致性問題,無非就是兩個主要問題:

  • 主服務器掛了,或者重啟了
  • 主從服務器之間同步數據~

Zookeeper是采用ZAB協議(Zookeeper Atomic Broadcast,Zookeeper原子廣播協議)來保證主從節點數據一致性的,ZAB協議支持崩潰恢複和消息廣播兩種模式,很好解决了這兩個問題:

  • 崩潰恢複:Leader掛了,進入該模式,選一個新的leader出來
  • 消息廣播: 把更新的數據,從Leader同步到所有Follower

Leader服務器掛了,所有集群中的服務器進入LOOKING狀態,首先,它們會選舉產生新的Leader服務器;接著,新的Leader服務器與集群中Follower服務進行數據同步,當集群中超過半數機器與該 Leader服務器完成數據同步之後,退出恢複模式進入消息廣播模式。Leader 服務器開始接收客戶端的事務請求生成事務Proposal進行事務請求處理。

寫在最後

學習技術是一條慢長而艱苦的道路,不能靠一時激情,也不是熬幾天幾夜就能學好的,必須養成平時努力學習的習慣。所以:貴在堅持!

最後再分享的一些BATJ等大廠20、21年的面試題,把這些技術點整理成了視頻和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由於篇幅有限,上面只是以圖片的形式給大家展示一部分。

 CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】

以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,_程序員_10

Mybatis面試專題

以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,_Java_11

MySQL面試專題

以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,_後端_12

並發編程面試專題

版权声明
本文为[愛寫代碼的瀟]所创,转载请带上原文链接,感谢
https://javamana.com/2021/09/20210915045435306p.html

  1. 不明白JVM虚拟机还怎么面试,一起刷完了这份1307页的Java面试宝典吧,
  2. Jdk's Past Life: The Classic Features of Thin Number - java5 - - - 15 -, webfront Development
  3. Résumé des questions d'entrevue pour les ingénieurs en développement Java, analyse des questions d'entrevue à haute fréquence Dubbo,
  4. Améliorer continuellement leur capacité à créer des primes, et les questions d'entrevue Java d'Alibaba Huawei Tencent et d'autres grandes usines sont sautées en octets.
  5. Install docker YJ version of openSUSE 11.3
  6. Je ne comprends pas comment la machine virtuelle JVM peut encore interviewer, et j'ai terminé ce dictionnaire d'entrevue Java de 1307 pages.
  7. 中软国际Java机试,如何写出高效率的SQL?
  8. 中级Java工程师面试,阿里 头条 腾讯等大厂Java笔试题目分享,
  9. 两年Java开发经验,为什么spring能最好地改变Java?
  10. Echarts realizes the rotation of the moon (super simple, you can see it at a glance)
  11. Deux ans d'expérience dans le développement de Java, pourquoi Spring peut - il le mieux changer Java?
  12. Entretien d'ingénieur Java intermédiaire, partage de sujets d'examen écrit Java de grandes usines comme Alibaba headline Tencent,
  13. Zhongsoft International Java Machine test, comment écrire un SQL efficace?
  14. Reflection type of Java Foundation
  15. Comment gérer efficacement les changements dans les ressources k8s?Analyse du mécanisme de mise en œuvre de k8s informer
  16. Installation de jdk1.8
  17. MySQL column - Linux underlying interaction and RAID storage architecture
  18. Interviewer: do redis transactions satisfy atomicity?
  19. 兩年Java開發經驗,為什麼spring能最好地改變Java?
  20. Migration practice from zookeeper to Nacos
  21. Dubbo's past and present life
  22. Initial experience of Dubbo application level service discovery
  23. Measure the Dubbo function of Tengine open source
  24. Comment envoyer 100 000 requêtes http le plus rapidement possible
  25. Huawei cloud guassdb (for redis) released a new version: Lua script and SSL connection encryption
  26. Mybatis vs hibernate, which performance is better?
  27. Python - Programmation orientée objet - _Rapport()
  28. Python - Programmation orientée objet - _Appel()
  29. JQuery Basics
  30. 五年Java开发经验面试,揭秘今年Java春招面试必问问题有哪些?
  31. 互联网Java工程师面试题,遇到的面试官都是架构师级别,
  32. Python - Programmation orientée objet - _Nouveau() et mode Singleton
  33. Python - Programmation orientée objet - méthode magique (méthode de double soulignement)
  34. Python - Programmation orientée objet - pratique (6)
  35. Python - Programmation orientée objet - réflexion hasattr, GetAttr, GetAttr, delattr
  36. Python - Programmation orientée objet - _Dict
  37. Computer graduation project java + SSM sorting algorithm online reading system
  38. Les questions d'entrevue pour les ingénieurs Java d'Internet, les intervieweurs rencontrés sont tous de niveau architecte,
  39. Cinq ans d'entrevue d'expérience en développement Java, découvrez les questions que vous devez poser lors de l'entrevue d'embauche du printemps Java de cette année.
  40. Java or the king of enterprise software- sivalabs
  41. 互聯網Java工程師面試題,遇到的面試官都是架構師級別,
  42. 从入门到精通系列Java高级工程师路线介绍,拼多多三面惨败,
  43. 今年最新整理的《高频Java面试题集合》,2021Java通用流行框架大全,
  44. La dernière collection de questions d'entrevue Java haute fréquence organisée cette année, 2021 Java Universal Popular Framework
  45. De l'introduction à l'introduction de l'itinéraire de l'ingénieur principal Java de la série Mastering, il y a eu de nombreux échecs.
  46. JavaScript operator (1), Web Development Engineer
  47. Java simultané Programming Books recommended, half - Runner Java Program see me easy to Attack!
  48. Trier les questions d'entrevue Javascript, trier les points de connaissance des itinéraires d'apprentissage
  49. Xiaopeng P7, a high-value domestic electric car that can't be missed
  50. Song Mengjun's "sleepless night" triggered an upsurge of dance storm after 00
  51. Encapsulated PHP sends HTTP requests with curl. Get and post are very easy to use
  52. Recommend a lightweight and practical excellent Linux panel - wgcloud
  53. 从思维图到基础再到深入,记一次字节跳动Java研发岗的面试经历,
  54. 从底层开始带你了解并发编程,五步搞定Java开发环境部署,
  55. 从基础到源码统统帮你搞定,一招彻底帮你搞定HashMap源码,
  56. 從基礎到源碼統統幫你搞定,一招徹底幫你搞定HashMap源碼,
  57. De la base au code source pour vous aider à résoudre tout, un tour pour vous aider à résoudre complètement le code source hashtap,
  58. Commencez par le bas pour vous familiariser avec la programmation simultanée, et terminez le déploiement de l'environnement de développement Java en cinq étapes.
  59. De la carte de pensée à la base et à l'approfondissement, prenez note de l'expérience d'entrevue d'un octet sautant le poste de recherche et développement Java.
  60. Good play | every character hates it. How does jade building spring do it?