Hazelcast Vert.x中的群集和共享数据

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.

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

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

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


提前谢谢

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()集群管理器。有关详细信息,请参阅其他答案。