我正在 Vert.x 中开发(基于 Netty 和 Hazelcast),我试图在两个服务器实例之间共享数据(每个实例都在不同的机器上,在同一个局域网上)。
我的问题是我不知道如何配置 vert.x 服务器以允许它们共享它们的并发内存映射(理论上说这是可能的)。
我已经阅读了很多关于 Vert.x 和 Hazelcast 的文档,但还没有结果。(我不知道如何强制 vert.x 加载 hazelcast xml 配置文件)。
提前致谢!
有在不同机器上的 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
使用 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);
});
}
Afaik 你不能在不同的 vert.x 实例之间共享数据——来自文档
“[...] 这样的用例可以通过提供一个共享的地图结构来更好地解决,该结构可以由同一个 vert.x 实例中的不同垂直实例直接访问。”
由于“vert.x 实例”表示“jvm 实例”,因此您不能在不同 jvm 之间使用 sharedmap/set。您可以为此使用事件总线。
在其他人投票之前进行编辑:我的回答来自 6 年前的 2012 年,当时这是不可能的。现在有可能正如其他人已经说过的那样
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 中使用,它将阻塞事件循环。
正如已经指出的,捆绑在 Vert.x 中的数据共享对象不支持跨多个 Vert.x 实例共享数据。为此,您必须执行以下任一操作:
SharedMap
实例并发布和侦听集群其余部分的更新。