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

17

我正在使用基于Netty和Hazelcast的Vert.x进行开发,尝试在两个服务器实例之间共享数据(每个实例在不同机器上,但在同一局域网内)。

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

我已经阅读了很多有关Vert.x和Hazelcast的文档,但还没有得到结果。(我不知道如何强制Vert.x加载Hazelcast XML配置文件)。

谢谢!

5个回答

11

在不同机器的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并将其封装在一个类中。如果我们将来想要更新Vertx,而这会导致它出现问题,我们只需要进行一次修改即可。顺便提一下,目的是注册通知以监视已关闭的节点。 - fionbio
Vert.x 3(及以上版本)具有公共异步API,可让您访问可插拔的集群管理器 - 可由Hazelcast IMDG、Apache Zookeeper、Apache Ignite、Infinispan(https://vertx.io/docs/#clustering)或其他实现 - 如果您想要实现ETCd(https://github.com/guoyu511/vertx-etcd)或Consul(https://github.com/reactiverse/consul-cluster-manager)集群管理器,该API非常简单。有关详细信息,请参见其他答案。 - Guss

8
使用Vert.x 3 - 如果你将你的Vert.x实例配置成"集群模式"(可以简单地在Vert.x启动器命令行中添加-cluster,具体见此处),那么你可以使用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);
            });
}

4
据文档所述,您不能在不同的vert.x实例之间共享数据。"[...] 这种用例最好通过提供共享映射结构来解决,该结构可以直接由同一vert.x实例中的不同垂直实例访问。" 由于“vert.x实例”表示“jvm实例”,因此无法在不同的jvm之间使用sharedmap/set。您可以使用事件总线来解决这个问题。需要说明的是,我的回答是2012年的,6年前,当时还不可能。现在已经有其他人说过这一点了。

3
我对vert.x不是非常熟悉,也不想反驳你的说法——使用Hazelcast(映射被复制)应该是可能的。 - ali haider
@castarco 文档还说:“在 vert.x 的后续版本中,我们的目标是扩展此功能,允许所有集群中的 vert.x 实例共享数据。”所以请注意这一点。 - Ricardo Stuven
@CarloBertuccini 有没有办法在Vert.x中使用Hazelcast数据结构? - VB_

3

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

然而,在Vert.x 2中,您可以直接在工作线程(worker verticles)中使用Hazelcast实例。只需使用Hazelcast的静态方法来获取Vert.x Hazelcast实例即可:

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

请注意,您应该仅在工作 verticle 内直接访问 Hazelcast API。Hazelcast API 是阻塞的,因此如果在普通 verticle 中使用它,它将阻塞事件循环。


2

正如所指出的那样,Vert.x捆绑的数据共享对象不支持在多个Vert.x实例之间共享数据。要实现这一点,您需要执行以下操作之一:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接