HazelCast分散式Map介紹和分析

weixin_34249678發表於2017-05-12

       HazelCast是一個高度可擴充套件的資料分發和叢集平臺,可以幫助架構師和開發者更容易設計和快速開發出高可擴充套件性的的實時應用,它提供的功能之一就是分散式實現java.util.{Queue,Set,List,Map}。

       分散式Map使用方法如下:

5734941-54a725f1a11ab110.png

        根據官方介紹,資料是分散式分散式的儲存在叢集中某臺機器上,而且會有備份,這樣即使某臺機器突然down掉,資料也不會丟失,那麼它是如何實現的呢,現在將原始碼分析如下:

       首先檢視IMap的類結構如下:

5734941-2551e3430934cc3d.png

        可以看出IMap其實是繼承了JDK的ConcurrentMap,因此它是一種執行緒安全的Map.繼承LegacyAsyncMap說明此Map是可以進行非同步獲取返回結果的,而且它繼承自DistributedObject介面,DistributedObject是分散式Map,分散式Set,分散式Queue等的超類,它具有PartitionKey,HazelCast使用它來進行分割槽。

        其次debug原始碼,來分析下Map資料的儲存和獲取原理。

a)HazelCast每一個應用節點啟動都是一個Node,node裡面包含了本節點對應的所有資訊和Service,例如下圖包含的這些service

5734941-7a654f4354b2c48b.png

我們getMap的過程其實就是從叢集內各個Node搜尋其儲存在哪裡的過程,由於IMap其實是一個DistributeObject,因此本質上就是一個getDistributedObject的過程,如下圖所示:

5734941-524ba6cfef2ffab7.png
如上圖所示程式先從當前node獲取到本機到ProxyService

b)使用代理ProxyService找到 繼承了DistributedObject的IMap.

ProxyService是通過註冊在記憶體的ProxyRegistry來進行處理的,如下圖所示

5734941-d478e81cf7ed74a1.png

ProxyRegistry來進行尋找或者生成一個DistributedObject.

c)ProxyRegistry內部包含了一個RemoteService,由remoteService來進行遠端或者本地的呼叫來獲取DistributedObject,如下圖所示,

5734941-501d448560eeefed.png

由於我們尋找的是一個Map,所以就會進入MapRemoteService的邏輯

createDistributedObject本質上返回的是一個Map的代理類MapProxyImpl,如下圖所示

5734941-b90713dd16789024.png

d)MapProxyImpl是個什麼呢,且看類圖如下:

5734941-e0608bdc9748e86d.png

看到沒,本質上還是一個DistributedObject,只不過相關的獲取資料,put資料都是在MapProxySupport內部做的。以get資料為例,

5734941-9cf13b5101885380.png

需要先將key序列化byte陣列,然後使用getInternal方法獲取到key對應的value,然後使用toObject將byte陣列反序列化為記憶體物件。後續的細節後面在分析!

@程式設計師  @IT網際網路

歡迎關注我的微信公眾號:

5734941-463a9b212f49151c.jpg

相關文章