我使用Vert.x进行开发(基于Netty和Hazelcast),并且尝试在两个服务器实例之间共享数据(这些实例分别位于不同的机器上,在同一个lan上)。
我的问题是我不知道如何配置vert.x服务器以允许它们共享它们的并发内存映射(理论上说这是可能的)。
我已经阅读了Vert.x和Hazelcast上的许多文档,但我还没有得到结果。(我不知道如何强制vert.x加载hazelcast xml配置文件)。
提前感谢!
发布于 2015-01-08 22:34:48
可以选择在不同计算机上的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发布于 2017-02-05 22:26:09
使用Vert.x3-如果您将Vert.x实例配置为“集群模式”(可以像将-cluster添加到Vert.x启动器的命令行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);
});
}发布于 2012-10-23 03:40:11
Afaik您不能在vert.x的不同实例之间共享数据--来自文档
"...通过提供可由同一vert.x实例中的不同verticle实例直接访问的共享地图结构,可以更好地解决这样的用例。“
因为"vert.x instance“意味着"jvm instance”,所以不能在不同的jvm之间使用sharedmap/set。您可以使用事件总线来实现这一点。
在其他人投反对票之前编辑:我的答案是2012年,6年前,当时这是不可能的。现在,正如其他人已经说过的那样,这是可能的
https://stackoverflow.com/questions/12299132
复制相似问题