2016-01-07 40 views
1

我使用IMap對象在集羣節點之間共享一些信息。 這些信息與節點相關,並且由共享映射中的同一節點插入,因此如果將節點從集羣中刪除沒有任何意義。Hazelcast Map:刪除掉落的節點擁有的條目

我知道存在MemberShipListener,我可以捕獲事件memberRemoved,但我不知道如何刪除已刪除成員擁有的條目。所以我想知道是否存在一種可以自動執行的方法。

回答

1

沒有自動的方式,至少不是我所知道的,但是您可以構建一個小的解決方法。要做到這一點,你需要保持第二個數據結構(一個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); 
    } 
} 

可能不是你要找的很好的解決方案,但到目前爲止,我看不到另一種方式來處理你的用例。我期待着其他的解決方案:)

+0

謝謝你的回答。這非常有幫助。我也嘗試,如果有其他解決方案,並讓你知道:) – srs

+0

我沒有找到其他解決方案。我試過如果有可能做Hazelcast本地地圖,但沒有結果。你知道有這種可能嗎?這將是一個有趣的功能,將納入Hazelcast?提前致謝。 – srs

+0

您可以隨時在github上發佈功能請求:-)只需鏈接到此討論,並對該想法/用例給出一個很好的描述。 – noctarius