0

ReplicatedMap<String, String>在我的 Hazelcast 集群中使用了一个。每个节点hazelcastInstance.getLocalEndpoint().getUuid()在此映射中都有其键 ( ) 和一些数据(JSON 字符串)。使用这张地图,我实现了一个服务,每个节点都有自己的数据存储,可以访问其他节点的数据,并观察变化。

但是,我很难让裂脑行为正确。

当脑裂合并发生时,我想收到一个entryAddedentryUpdated事件。然而,这种情况并非如此。我认为这是设计使然(?)。EntryListenerReplicatedMap

你能想到什么解决方案来解决这个问题?

想法:

  • MembershipListener可以检测裂脑合并。问题: 中的数据ReplicatedMap不一定已经准备好 - 它可能在memberAdded事件被调用之前或之后准备好。
  • 实施MergePolicy,例如:

    public Object merge(String mapName, ReplicatedMapEntryView mergingEntry, ReplicatedMapEntryView existingEntry) {
        // every node knows its own values! (somehow existingEntry and mergingEntry are swapped?)
        // mergingEntry seems to be the destination (current local value)
        // existingEntry seems to be the value from the other member
        if (mergingEntry.getKey().equals(hazelcastUuid)) {
            return mergingEntry.getValue();
        } else {
            return existingEntry.getValue();
        }
    }
    

    问题:当裂脑合并两个节点时,这可以正常工作。但是,使用四个节点(两台不同机器上的每台机器两个节点),它会消除值并且似乎随机运行。我怀疑我的理解通常是错误的,因为这种方法没有按预期工作。正因为如此,我还没有分析四个节点的行为——分析四个日志文件也是相当耗时的。

4

0 回答 0