Vert.x中的群集和共享数据

时间:2012-09-06 11:32:06

标签: hazelcast vert.x

我正在开发Vert.x(基于Netty和Hazelcast),我正在尝试在两个服务器实例之间共享数据(在同一局域网中不同机器中的那些实例的eache)。

我的问题是我不知道如何配置vert.x服务器以允许它们共享它们的并发内存映射(理论上说这是可能的)。

我已经阅读过Vert.x和Hazelcast的许多文档,但我还没有结果。 (我不知道如何强制vert.x加载hazelcast xml配置文件)。

提前致谢!

5 个答案:

答案 0 :(得分:8)

有不同机器上的vertx实例之间共享数据的选项

选项1。

您可以使用Vert.x ClusterManager及其地图:

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

该地图由Hazelcast IMap支持并分发。这假设您使用-cluster参数运行vertx并配置了群集。

但请注意,这是内部API ,通常不建议用于生产。如果您正在进行一次性实验,那么它可能会有用。

选项2。

一旦vertx以群集模式启动,您就可以访问Hazelcast:

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

答案 1 :(得分:5)

使用Vert.x 3 - 如果将Vert.x实例配置为&#34;群集模式&#34; (可以像将-cluster添加到Vert.x启动程序的命令行see here for details)一样简单,然后您可以使用SharedData界面访问&#34;分布式地图&#34;它允许集群成员透明地在集群中读写数据。

示例:

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

答案 2 :(得分:3)

Afaik你不能在不同的vert.x实例之间共享数据 - 来自文档

“[...]通过提供可以由同一vert.x实例中的不同Verticle实例直接访问的共享映射结构,可以更好地解决这种用例。”

由于“vert.x instance”表示“jvm instance”,因此不能在不同的jvm之间使用sharedmap / set。您可以使用事件总线。

在其他人投票之前编辑:我的回答是从2012年,6年前,当时这是不可能的。现在有可能正如其他人已经说过的那样

答案 3 :(得分:3)

Vert.x 2不支持群集范围的共享数据。但是,Vert.x 3确实公开了一个包装底层Hazelcast集群管理器的异步API。

但是,对于Vert.x 2,您可以直接在工作者Verticle中使用Hazelcast实例。只需使用Hazelcast的静态方法获取Vert.x Hazelcast实例:

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

请注意,您应该只从工作者Verticle中以这种方式直接访问Hazelcast API。 Hazelcast API是阻塞的,因此如果在普通Verticle中使用它将阻止事件循环。

答案 4 :(得分:2)

正如已经指出的,Vert.x中捆绑的数据共享对象不支持跨多个Vert.x实例共享数据。为了做到这一点,你必须做到:

  1. 使用“普通”共享数据库。
  2. 设置Verticle,管理SharedMap个实例,并发布和侦听与群集其余部分之间的更新。
  3. 设计您的应用程序,这样您就不需要以这种方式共享数据。
相关问题