我ReplicatedMap<String, String>
在我的 Hazelcast 集群中使用了一个。每个节点hazelcastInstance.getLocalEndpoint().getUuid()
在此映射中都有其键 ( ) 和一些数据(JSON 字符串)。使用这张地图,我实现了一个服务,每个节点都有自己的数据存储,可以访问其他节点的数据,并观察变化。
但是,我很难让裂脑行为正确。
当脑裂合并发生时,我想收到一个entryAdded
或entryUpdated
事件。然而,这种情况并非如此。我认为这是设计使然(?)。EntryListener
ReplicatedMap
你能想到什么解决方案来解决这个问题?
想法:
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(); } }
问题:当裂脑合并两个节点时,这可以正常工作。但是,使用四个节点(两台不同机器上的每台机器两个节点),它会消除值并且似乎随机运行。我怀疑我的理解通常是错误的,因为这种方法没有按预期工作。正因为如此,我还没有分析四个节点的行为——分析四个日志文件也是相当耗时的。