2012-09-06 75 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); 
      }); 
}