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