Hazelcast與MongoDB集成

jopen 8年前發布 | 17K 次閱讀 MongoDB NoSQL數據庫

一、Hazelcast與MongoDB

Hazelcast的分布式數據結構和計算性能使得它可以作為應用程序后端的“MongoDB”。

MongoDB是一個開源的、面向文檔的數據庫,其擴展性和靈活性都非常好。MongoDB不是把數據存入(關系數據庫的)表和行,而類似于JSON文檔的方式和是以動態模式進行存儲。簡而言之,MongoDB是一種NoSQL數據存儲,主要涉及數據的存儲和持久化以及無模式數據的檢索。

Hazelcast是一個開源的、分布式的、高可用的、可擴展的內存數據網格存儲,它基于Apache v2許可證發布,可用作緩存、消息代理器以及分布式計算平臺。Hazelcast強調高速訪問分布式數據(通常是分布式的緩存)、分布式計算和分布式消息。

可以查看這個文檔: https://hazelcast.com/use-cases/nosql/nosql-data-store/

Hazelcast可以當作NoSQL存儲方案。MongoDB有一些數據網格、網格計算的功能,但MongoDB在這方面未做最優化。因此,Hazelcast和MongoDB在這方面做功能對比,有點類似于比較蘋果和桔子。

Hazelcast和MongoDB可以結合起來協同工作,而不是相互競爭。Hazelcast支持使用MongoDB作為其后端的數據存儲。把Hazelcast的數據映射到MongoDB是很容易的,無論是數據直接寫還是延后寫都支持。

下面我們回顧一下Hazelcast和MongoDB的特性,看看他們怎樣相互配合工作。

二、特征

1、簡單性

Hazelcast和MongoDB這兩種技術運行都很簡單,我們可以讓MongoDB在幾分鐘內實現完全啟動。比如,在Mac OS X系統上,可以使用brew安裝MongoDB。

brew mongo install

Hazelcast的啟動同樣簡單。

2、對Java開發者的優勢

Hazelcast和MongoDB對于開發Java應用程序來說,是非常適合的。對于Hazelcast來說,可以在集群中直接使用Java對象,無需擔憂數據傳輸層的問題,這樣開發工作就簡化了很多。而使用MongoDB就既需要使用MongoDB的數據結構,又需要寫和配置數據傳輸層。

BSON庫完全支持BSON數據格式、數據存儲格式和網絡傳輸層格式,MongoDB使用BSON作為存儲的“文檔”。BSON是二進制JSON的簡稱,是JSON數據序列化的二進制編碼。

MongoDB官網上有Java驅動包,而且此驅動包是一個Java對象文檔映射框架,可以把MongoDB的文檔與Java對象進行雙向映射。

就部署和集成Java應用而言,Hazelcast可以給應用帶來低延遲的數據訪問特性(通過各種機制),尤其是Hazelcast客戶端的就近緩存和Hazelcast成員的嵌入式部署。而對于MongodB,網絡延遲是存在的,因為它沒有本地內存緩存。

3、分布式計算

Hazelcast的分布式計算框架極其強大,它允許任意業務邏輯執行位置引用,并支持跨集群的分布式擴展。MongoDB支持單線程的MapReduce框架,但不支持任意的用戶代碼執行。

Hazelcast在分布式計算方面還有很多MongoDB不具備的功能特性,比如分布式并發工具:鎖、信號量、隊列等,可以把任務協調分布到多個節點并行工作,而這些在本地是很難實現的。我知道很多人使用MongoDB作為他們自己的消息代理器的實現,但是很難想象,僅使用MongoDB如何實現實際的并行。

4、持久化

Hazelcast主要是解決訪問分布式數據和進行分布式計算時保持低延遲。默認情況下,Hazelcast不涉及磁盤或其它持久化的存儲。Hazelcast不是數據庫。而MongoDB是一個真正的持久化數據庫(當然,MongoDB的持久化也有一點問題,因為它的寫操作是寫內存,不是同步寫入磁盤的。)

我們來看看把Hazelcast的數據持久化到MongoDB所帶來的好處吧:

1)IMap和MapStore

Hazelcast的通讀/通寫功能是兩個接口:MapLoader和MapStore。如果只需從數據庫讀取數據,那么開發者只需實現MapLoader接口。

MapLoader接口

public interface MapLoader<K, V> {
    V load(K key); (1)
    Map<K, V> loadAll(Collection<K> keys); (2)
    Iterable<K> loadAllKeys(); (3)
}
  • 1)方法一是獲取給定鍵名的值。如果分布式的Map中未包含給定鍵名的值,那么Hazelcast將調用load(key)方法的實現來獲取這個值。
  • 2)方法二是獲取鍵名集合對應的所有鍵值。這是一個批讀取操作,是針對多個讀取給定鍵名的值的優化。
  • 3)方法三是獲取存儲區的所有鍵名。

MapStore接口繼承了MapLoader接口,并允許保存IMap條目到數據庫。

MapStore接口

public interface MapStore<K, V> extends MapLoader<K, V> {
    void store(K key, V value); (1)
    void storeAll(Map<K, V> map); (2)
    void delete(K key); (3)
    void deleteAll(Collection<K> keys); (4)
}
  • 1)存儲鍵值對
  • 2)存儲多個條目。此方法的實現可以優化多個存儲鍵值對的操作
  • 3)刪除給定鍵名的條目
  • 4)刪除給定鍵名集合的多個條目

要想對MapLoader和MapStore接口了解的更多,查看文檔: http://docs.hazelcast.org/docs/3.5/manual/html-single/index.html#map-persistence

要與MongoDB互動,使用mongo-java-driver驅動包。

Maven依賴配置如下:

<dependency>
   <groupId>org.mongodb</groupId>
   <artifactId>mongo-java-driver</artifactId>
   <version>${mongo-java-driver.version}</version>
</dependency>


MongoClient mongoClient = new MongoClient(new MongoClientURI(mongoUrl)); (1)
MongoCollection collection = mongoClient.getDatabase(dbName).getCollection(collectionName); (2)
final Document document = (Document) collection.find(eq("_id", key)).first(); (3)
collection.insertOne(document); (3)
  • 1)使用給定URI(比如mongodb://localhost:27017)建立到MongoDB實例的連接
  • 2)MongoClient類提供了連接MongoDB實例、訪問數據庫、訪問集合、訪問文檔的方法
  • 3)MongoCollection類允許對集合中的文檔進行增刪改查

總結

MongoDB結合Hazelcast,可以提供低延遲訪問分布式、無模式的數據的解決方案。如果你在尋求NoSQL數據存儲解決方案,MongoDB是很適合的。Hazelcast的fenbushii數據結構和分布式計算能力,是MongoDB所不具備的。

來自: http://blog.csdn.net/chszs/article/details/50263213

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!