【问题标题】:Determine if Hazelcast Node Owns Map Entry确定 Hazelcast 节点是否拥有地图条目
【发布时间】:2021-11-05 08:18:36
【问题描述】:

我在 4 节点集群上运行 Hazelcast,特别需要拦截会话过期事件以审核事件和其他一些清理任务。由于这些任务只需要执行一次,我尝试将MapListener<String, ExpiringSession> 作为本地地图侦听器附加到会话IMap。这不符合我的需要。

我现在正在尝试创建一个地图拦截器,但发现自己需要通过仅在拥有该特定会话条目的 Hazelcast 节点上运行某些代码来“伪造”本地地图侦听器所做的事情。

下面是代码的模型。

    @Override
    public Object interceptRemove(Object removedValue) {

        // ApplicationSession implements ExpiringSession and also contains the session id
        ApplicationSession session = (ApplicationSession) removedValue;
        // Can I see if the current node actually owns the removed value?

        // if the session is expired, we need to do a session logout audit
        if (session.isExpired()) {
            // do the logout event audit
        }

        // perform other tasks
        return removedValue;
    }

所以我的问题是,我怎么知道哪个 Hazelcast 节点“拥有”ExpiringSession,因为它可能是 4 个节点中的任何一个?我知道这似乎是一种迂回的方式,但同样,作为本地侦听器这样做并不能满足我的需求(由于我不想进入的应用程序的一些其他问题)。

【问题讨论】:

    标签: hazelcast hazelcast-imap


    【解决方案1】:

    我对此没有完全制定的解决方案,但我认为您可能会使用类似于以下方法的方法。

    鉴于您的地图条目的键,

      Partition partition = hazelcastInstance.getPartitionService().getPartition(key);
    

    这将为您提供对条目所属分区的引用。该值在集群的生命周期内应该是恒定的(并且只有在集群分区计数发生变化时才会改变)。

    然后可以通过调用查看分区是否是本地的

    boolean isLocal = partition.getOwner().localMember();
    

    如果集群成员发生变化,分区所有者将发生变化,因此您可能需要在执行第二部分之前检查 PartitionService.isClusterSafe(),即使这样,在您检查后状态也可能会发生变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多