2012-09-06 112 views
12

我在Vert.x中開發(基於Netty和Hazelcast),我試圖在兩個服務器實例之間共享數據(在不同機器中的這些實例的eache,相同的lan)。Vert.x中的羣集和共享數據

我的問題是,我不知道如何配置vert.x服務器,讓他們共享他們的併發內存映射(理論說這是可能的)。

我讀過Vert.x和Hazelcast的許多文檔,但是我還沒有找到結果。 (我不知道如何強制Vert.x加載hazelcast xml配置文件)。

在此先感謝!

回答

4

AFAIK不能共享vert.x的不同實例之間的數據 - 從文檔

「[...]這樣的用例是通過提供一種共享地圖結構較好地解決了,可以是直接由同一個vert.x實例中的不同Verticle實例訪問。「

由於「vert.x實例」的意思是「jvm實例」,所以不能在不同的jvm之間使用sharedmap/set。你可以使用這個事件總線。

+2

我不完全熟悉vert.x&不是使用您的陳述不同意 - 這應該使用hazelcast是可能的(圖被複制)。 –

+0

@castarco該文檔還說:「在更高版本的vert.x中,我們的目標是擴展這個數據以允許集羣中所有vert.x實例共享數據。」所以請留意一下。 –

+0

@CarloBertuccini有什麼方法可以在Vert.x中使用Hazelcast數據結構? –

2

如前所述,Vert.x捆綁的數據共享對象不支持跨多個Vert.x實例共享數據。爲了做到這一點,你必須做:

  1. 使用「正常」共享數據庫。
  2. 設置管理SharedMap實例的Verticle,併發布和偵聽集羣其餘部分的更新。
  3. 設計你的應用程序,所以你不需要以這種方式共享數據。
7

有在不同的機器共享vertx實例之間的數據

選項選項1.

您可以使用Vert.x ClusterManager,它的地圖:

ClusterManager clusterManager = ((VertxInternal)vertx).clusterManager(); 
Map map = clusterManager.getSyncMap("mapName"); // shared distributed map 

該地圖由Hazelcast IMap支持並分發。這假定你使用0​​參數運行vertx並配置了集羣。

但是請注意,這是內部API,通常不推薦用於生產。如果你正在做一次實驗,那麼它可能會有用。

選項2

您可以訪問Hazelcast一次vertx在集羣模式下啓動:

Set<HazelcastInstance> instances = Hazelcast.getAllHazelcastInstances(); 
    HazelcastInstance hz = instances.stream().findFirst().get(); 
    Map map = hz.getMap("mapName"); // shared distributed map 
+0

選擇1並將其包裝在一個班級中。如果我們想在未來的時間裏更新vertx,我們會有一站式購物。僅供參考,目的是註冊通知以監視已關閉的節點。 – fionbio

3

Vert.x 2不支持集羣範圍內共享數據。但是,Vert.x 3確實公開了一個封裝了底層Hazelcast集羣管理器的異步API。

For Vert。x 2,但是,您可以直接在您的工作者Verticle中使用Hazelcast實例。只要使用Hazelcast的靜態方法來獲取Vert.x Hazelcast實例:

HazelcastInstance hazelcast = Hazelcast.getAllHazelcastInstances().iterator().next(); 

請注意,您應該只從一個工人verticle內直接訪問Hazelcast API以這種方式。 Hazelcast API是阻塞的,所以如果在正常的Verticle中使用,它將阻止事件循環。

3

使用Vert.x 3 - 如果將Vert.x實例配置爲「羣集模式」(可以像將Vertica.x啓動器的命令行中添加-cluster一樣簡單,則可以使用see here for details),那麼您可以使用SharedData接口可以訪問「分佈式映射」,它允許集羣成員透明地在集羣中讀取和寫入數據。

例子:

if (vertx.isClustered()) { 
    log.info("Using clustered data store"); 
    vertx.sharedData().<String, MyEntity>getClusterWideMap("entities", 
      res -> { 
       AsyncMap<String, MyEntity> dataMap = res.result(); 
       setDataStore(dataMap); 
      }); 
}