1
我使用IMap对象在集群节点之间共享一些信息。 这些信息与节点相关,并且由共享映射中的同一节点插入,因此如果将节点从集群中删除没有任何意义。Hazelcast Map:删除掉落的节点拥有的条目
我知道存在MemberShipListener,我可以捕获事件memberRemoved,但我不知道如何删除已删除成员拥有的条目。所以我想知道是否存在一种可以自动执行的方法。
我使用IMap对象在集群节点之间共享一些信息。 这些信息与节点相关,并且由共享映射中的同一节点插入,因此如果将节点从集群中删除没有任何意义。Hazelcast Map:删除掉落的节点拥有的条目
我知道存在MemberShipListener,我可以捕获事件memberRemoved,但我不知道如何删除已删除成员拥有的条目。所以我想知道是否存在一种可以自动执行的方法。
没有自动的方式,至少不是我所知道的,但是您可以构建一个小的解决方法。要做到这一点,你需要保持第二个数据结构(一个MultiMap)来保存关于成员及其指定键的唯一ID的信息。下面给出了一些伪代码:
class MapWrapper<K, V> {
MultiMap<String, K> metadata = hazelcastInstance.getMultiMap("metadata");
Cluster cluster = hazelcastInstance.getCluster();
Member localMember = cluster.getLocalMember();
String uuid = localMember.getUuid();
IMap<K, V> realMap = hazelcastInstance.getMap("...");
public void putWrapper(K key, V value) {
realMap.put(key, value);
metadata.put(uuid, key);
}
}
您可以通过询问所有成员的集群使用MembershipListerner和第一次测试,如果当前节点是“领导者”(最老集群的成员),并采取的第一个结果集。
Cluster cluster = hazelcastInstance.getCluster();
Member leader = cluster.getMembers().iterator().next();
if (cluster.getLocalMember().equals(leader)) { ... }
现在,因为你知道这个操作将只发生一次(仅适用于领导者)只使用元数据删除元素,如下列:
void memberRemoved(MembershipEvent membershipEvent) {
if (isLeader()) {
Member removedMember = membershipEvent.getMember();
Collection<K> keys = metadata.remove(removedMember.getUuid());
realMap.removeAll(keys);
}
}
可能不是你要找的很好的解决方案,但到目前为止,我看不到另一种方式来处理你的用例。我期待着其他的解决方案:)
谢谢你的回答。这非常有帮助。我也尝试,如果有其他解决方案,并让你知道:) – srs
我没有找到其他解决方案。我试过如果有可能做Hazelcast本地地图,但没有结果。你知道有这种可能吗?这将是一个有趣的功能,将纳入Hazelcast?提前致谢。 – srs
您可以随时在github上发布功能请求:-)只需链接到此讨论,并对该想法/用例给出一个很好的描述。 – noctarius