我正在使用基于Netty和Hazelcast的Vert.x进行开发,尝试在两个服务器实例之间共享数据(每个实例在不同机器上,但在同一局域网内)。
我的问题是我不知道如何配置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
-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);
});
}
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 中使用它,它将阻塞事件循环。
正如所指出的那样,Vert.x捆绑的数据共享对象不支持在多个Vert.x实例之间共享数据。要实现这一点,您需要执行以下操作之一:
SharedMap
实例并发布和侦听来自集群其余部分的更新的Verticle。