gpt4 book ai didi

java - Hazelcast map : remove entries owned by the node that goes down

转载 作者:行者123 更新时间:2023-11-30 08:42:08 24 4
gpt4 key购买 nike

我使用 IMap 对象在集群节点之间共享一些信息。此信息与节点相关,并由共享映射中的同一节点插入,因此如果从集群中删除节点,则没有意义。

我知道存在一个 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);
}
}

可能不是您正在寻找的好的解决方案,但到目前为止我没有看到另一种方法来处理您的用例。我期待其他解决方案:)

关于java - Hazelcast map : remove entries owned by the node that goes down,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34666561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com