2017-05-18 3 views
2

私は春+ Hazelcast 3.8.2を使用していますが、Spring構成使用して、このようなマップを設定している:私は接続されている2つのクライアント(両方を持っているHazelcastニア・キャッシュ:別のノードに変更された場合は立ち退か

<hz:map name="test.*" backup-count="1" 
    max-size="0" eviction-percentage="30" read-backup-data="true" 
    time-to-live-seconds="900" 
    eviction-policy="NONE" merge-policy="com.hazelcast.map.merge.PassThroughMergePolicy"> 
    <hz:near-cache max-idle-seconds="300" 
     time-to-live-seconds="0" 
     max-size="0" /> 
</hz:map> 

を同じマシン上の[test env]、異なるポートを使用して)。

1つのクライアント上のマップの値を変更すると、残りのクライアントは、有効期限が切れたためにニア・キャッシュから追い出されるまで、古い値を保持します。

私はここで、このような同様の問題が見つかりました:Hazelcast near-cache eviction doesn't work

をしかし、これは実際には同じ問題が、少なくともこれは、バージョン3.7のバグだったと我々は3.8を使用していると述べられている場合、私はわかりませんよ。 2。

これは正しい動作ですか、何か間違っていますか?私はプロパティーinvalidate-on-changeがあることを知っていますが、デフォルトではこれはtrueですので、私はこれを設定する必要はありません。

read-backup-datafalseに設定してみましたが、役に立たないです。

答えて

0

クリスチャンのご支援のための

おかげで私は解決策を自分自身を発見しました。

問題は、Hazelcastがデフォルトで無効化をバッチで送信するため、無効化が他のすべてのノードに送信されるまで数秒間待機することです。

あなたはここにこれについての詳細な情報を見つけることができます。

http://docs.hazelcast.org/docs/3.8/manual/html-single/index.html#near-cache-invalidationは、だから私はすぐにすべてのノードに無効化を送信しますfalseにプロパティhazelcast.map.invalidation.batch.enabledを設定する必要がありました。しかし、ドキュメントに記載されているように、これは、あまりにも多くのput/remove/...操作が予想されない場合にのみ使用してください。これにより、イベントシステムが非常に忙しくなります。

しかし、このプロパティが設定されていても、すべてのノードがニア・キャッシュ・エントリを直接無効にするとは限りません。私は別のノードの値に直接アクセスした後に時々それがうまくいくことに気付きました。常に成功しただけで、時には成功し

@Test 
public void testWithInvalidationBatchEnabled() throws Exception { 
    System.setProperty("hazelcast.map.invalidation.batch.enabled", "true"); 

    doTest(); 
} 

@Test 
public void testWithoutInvalidationBatchEnabled() throws Exception { 
    System.setProperty("hazelcast.map.invalidation.batch.enabled", "false"); 

    doTest(); 
} 

@After 
public void shutdownNodes() { 
    Hazelcast.shutdownAll(); 
} 

protected void doTest() throws Exception { 
    // first config for normal cluster member 
    Config c1 = new Config(); 
    c1.getNetworkConfig().setPort(5709); 

    // second config for super client 
    Config c2 = new Config(); 
    c2.getNetworkConfig().setPort(5710); 

    // map config is the same for both nodes 
    MapConfig testMapCfg = new MapConfig("test"); 
    NearCacheConfig ncc = new NearCacheConfig(); 
    ncc.setTimeToLiveSeconds(10); 
    testMapCfg.setNearCacheConfig(ncc); 

    c1.addMapConfig(testMapCfg); 
    c2.addMapConfig(testMapCfg); 

    // start instances 
    HazelcastInstance h1 = Hazelcast.newHazelcastInstance(c1); 
    HazelcastInstance h2 = Hazelcast.newHazelcastInstance(c2); 

    IMap<Object, Object> mapH1 = h1.getMap("test"); 
    IMap<Object, Object> mapH2 = h2.getMap("test"); 

    // initial filling 
    mapH1.put("a", -1); 

    assertEquals(mapH1.get("a"), -1); 
    assertEquals(mapH2.get("a"), -1); 

    int updatedH1 = 0, updatedH2 = 0, runs = 0; 
    for (int i = 0; i < 5; i++) { 
     mapH1.put("a", i); 

     // without this short sleep sometimes the nearcache is updated in time, sometimes not 
     Thread.sleep(100); 

     runs++; 
     if (mapH1.get("a").equals(i)) { 
      updatedH1++; 
     } 
     if (mapH2.get("a").equals(i)) { 
      updatedH2++; 
     } 
    } 

    assertEquals(runs, updatedH1); 
    assertEquals(runs, updatedH2); 
} 

testWithInvalidationBatchEnabled finishs、testWithoutInvalidationBatchEnabled finishs:ここ

は、私はこのために構築JUnitテストです。

関連する問題