17

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

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

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

提前致谢!

4

5 回答 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
于 2015-01-08T14:34:48.330 回答
8

使用 Vert.x 3 - 如果您将 Vert.x 实例配置为“集群模式”(这可以像添加-cluster到 Vert.x 启动器的命令行一样简单,请参阅此处了解详细信息),那么您可以使用该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);
            });
}
于 2017-02-05T14:26:08.923 回答
4

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

“[...] 这样的用例可以通过提供一个共享的地图结构来更好地解决,该结构可以由同一个 vert.x 实例中的不同垂直实例直接访问。”

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

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

于 2012-10-22T19:40:10.953 回答
3

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

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

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

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

于 2015-02-06T06:43:42.430 回答
2

正如已经指出的,捆绑在 Vert.x 中的数据共享对象不支持跨多个 Vert.x 实例共享数据。为此,您必须执行以下任一操作:

  1. 使用“普通”共享数据库。
  2. 设置一个 Verticle,它管理SharedMap实例并发布和侦听集群其余部分的更新。
  3. 设计您的应用程序,这样您就不需要以这种方式共享数据。
于 2014-10-12T11:35:27.997 回答