Hazelcast Vert.x中的群集和共享数据
我在Vert.x(基于Netty和Hazelcast)中开发,并尝试在两个服务器实例之间共享数据(在同一局域网上的不同机器中的每个实例) 我的问题是,我不知道如何配置vert.x服务器以允许它们共享其并发内存映射(理论上说这是可能的) 我已经阅读了很多关于Vert.x和Hazelcast的文档,但还没有结果。(我不知道如何强制vert.x加载hazelcast xml配置文件)Hazelcast Vert.x中的群集和共享数据,hazelcast,vert.x,Hazelcast,Vert.x,我在Vert.x(基于Netty和Hazelcast)中开发,并尝试在两个服务器实例之间共享数据(在同一局域网上的不同机器中的每个实例) 我的问题是,我不知道如何配置vert.x服务器以允许它们共享其并发内存映射(理论上说这是可能的) 我已经阅读了很多关于Vert.x和Hazelcast的文档,但还没有结果。(我不知道如何强制vert.x加载hazelcast xml配置文件) 提前谢谢 Afaik您不能在vert.x的不同实例之间共享数据——从文档中可以看出 “[…]通过提供可由同一vert.
提前谢谢 Afaik您不能在vert.x的不同实例之间共享数据——从文档中可以看出 “[…]通过提供可由同一vert.x实例中的不同verticle实例直接访问的共享映射结构,可以更好地解决此类用例。” 因为“vert.x instance”意味着“jvm实例”,所以不能在不同的jvm之间使用sharedmap/set。您可以为此使用事件总线
在别人投反对票之前编辑:我的答案是6年前的2012年,当时这是不可能的。现在有可能,正如其他人所说的那样,正如已经指出的,捆绑在Vert.x中的数据共享对象不支持跨多个Vert.x实例共享数据。为此,您必须执行以下任一操作:
SharedMap
实例,并发布和侦听集群其余部分的更新在不同机器上的vertx实例之间有共享数据的选项 选项1。 您可以使用Vert.x及其地图:
ClusterManager clusterManager = ((VertxInternal)vertx).clusterManager();
Map map = clusterManager.getSyncMap("mapName"); // shared distributed map
该地图由Hazelcast IMap支持并分发。这假设您正在使用-cluster
参数运行vertx,并且已经配置了集群
但是请注意,这是内部API,一般不建议用于生产。如果你正在做一次实验,那么它可能是有用的
选项2。
在群集模式下启动Vertex后,您可以访问Hazelcast:
Set instances=Hazelcast.getAllHazelcastInstances();
HazelcastInstance hz=instances.stream().findFirst().get();
Map Map=hz.getMap(“mapName”);//共享分布式地图
Vert.x 2不支持群集范围的共享数据。但是,Vert.x 3确实公开了一个异步API,它封装了底层Hazelcast群集管理器
不过,对于Vert.x2,您可以直接在worker verticles中使用Hazelcast实例。只需使用Hazelcast的静态方法即可获得Vert.x Hazelcast实例:
HazelcastInstance hazelcast = Hazelcast.getAllHazelcastInstances().iterator().next();
请注意,您只能通过这种方式从worker verticle中直接访问Hazelcast API。Hazelcast API正在阻塞,因此如果在正常的verticle中使用,它将阻塞事件循环。对于Vert.x 3-如果您将Vert.x实例配置为“群集模式”(可以简单地将
-cluster
添加到Vert.x启动器的命令行),那么您可以使用该接口访问“分布式映射”它允许集群成员透明地跨集群读写数据
例如:
if (vertx.isClustered()) {
log.info("Using clustered data store");
vertx.sharedData().<String, MyEntity>getClusterWideMap("entities",
res -> {
AsyncMap<String, MyEntity> dataMap = res.result();
setDataStore(dataMap);
});
}
if(vertx.isClustered()){
log.info(“使用集群数据存储”);
vertx.sharedData().getClusterWideMap(“实体”,
res->{
AsyncMap dataMap=res.result();
setDataStore(数据映射);
});
}
我对vert.x不太熟悉&我不想不同意你的说法-这应该可以使用hazelcast(地图被复制)。@castarco文档还说:“在vert.x的更高版本中,我们的目标是扩展它,允许集群中的所有vert.x实例共享数据。”所以请注意这一点。@CarloBertuccini有没有办法在Vert.x中使用Hazelcast数据结构?使用选项1并将其包装在一个类中。如果我们想在将来更新vertx,我们有一站式购物。仅供参考,其目的是注册通知以监控宕机节点。Vert.x 3(及以上版本)有一个公共异步API,让您可以访问可插拔群集管理器(可由Hazelcast IMDG、Apache Zookeeper、Apache Ignite、Infinispan()或其他人实现),该API非常简单,如果您想实现ETCd()或concur()集群管理器。有关详细信息,请参阅其他答案。