Hazelcast: Bisakah saya mengonfigurasi Peta per JVM?

Apakah ada opsi di Hazelcast untuk membuat nilai cache peta per node, dan tidak mereplikasi statusnya? Saya pikir ini adalah perbedaan antara getMap() dan getDistributedMap() tetapi tampaknya keduanya direplikasi antar node.

Saya memiliki aplikasi di cluster Weblogic, konfigurasi saya adalah:

<?xml version="1.0" encoding="UTF-8"?>
<hazelcast>
    <properties>
        <property name="hazelcast.logging.type">slf4j</property>
    </properties>
    <network>
        <port auto-increment="true">5107</port>
        <join>
            <multicast enabled="false" />
            <tcp-ip enabled="true">
                <members>127.0.0.1:5701, 127.0.0.2:5702</members>
            </tcp-ip>
        </join>
    </network>
    <map name="default">
        <time-to-live-seconds>1800</time-to-live-seconds>
        <backup-count>0</backup-count>
        <eviction-policy>LRU</eviction-policy>
    </map>
</hazelcast>

Di log saya dapat melihat bahwa kedua node sudah aktif

Members [2] {
        Member [127.0.0.1]:5107
        Member [127.0.0.1]:5108 this
}

Ketika saya memanggil metode saya di node pertama saya dapat melihat bahwa cache telah ditambahkan

.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Hazelcast instance HazelcastInstance{name='my-instance', node=Address[127.0.0.1]:5107}
2015-03-31 21:09:40.040 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Cache map IMap{name='MY_APP.Cache.cacheName'}
2015-03-31 21:09:40.040 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - adding object in the cache with key 2342425

Tapi di node kedua saya hanya melihat log nama cache, jadi menggunakan cache yang sudah ditambahkan...

.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Hazelcast instance HazelcastInstance{name='my-instance', node=Address[127.0.0.1]:5108}
2015-03-31 21:09:40.040 [[ACTIVE] ExecuteThread: '1' for queue: 'weblogic.kernel.Default (self-tuning)'] [] DEBUG b.c.l.c.c.i.e.c.h.AbstractHazelcastCacheInterceptor - Cache map IMap{name='MY_APP.Cache.cacheName'}

Apakah saya melewatkan beberapa konfigurasi? Apakah mungkin untuk mencapainya dengan Hazelcast?


person Community    schedule 01.04.2015    source sumber
comment
mengapa Anda ingin menggunakan Hazelcast untuk ini daripada Java Map biasa (atau cache Guava atau yang serupa)?   -  person Mateusz Dymczyk    schedule 01.04.2015
comment
Persyaratannya adalah untuk dapat melakukan penggusuran terdistribusi, tetapi tidak dapat berbagi data cache.   -  person    schedule 01.04.2015
comment
jadi Anda ingin dapat menempatkan barang hanya secara lokal tetapi ketika Anda mengeluarkannya, barang itu harus dikeluarkan di semua node? itu sepertinya bukan solusi yang sangat transparan. Jangan berpikir hazelcast mendukung hal itu, kira Anda dapat dengan mudah mengimplementasikannya menggunakan ITopic hazelcast, menerbitkan eviction dan memiliki pendengar di setiap node.   -  person Mateusz Dymczyk    schedule 01.04.2015
comment
@MateuszDymczyk Ya, saya ingin menggunakan jaringan untuk melakukan operasi hanya jika ini benar-benar diperlukan. Saya akan mencoba ITopic, terima kasih!   -  person    schedule 01.04.2015
comment
@ SérgioMichels, beri tahu saya bagaimana Anda berhasil mengonfigurasi slf4j untuk masuk dalam mode DEBUG? Bolehkah Anda melihat di sini stackoverflow.com/questions/30391834/ tolong?   -  person VB_    schedule 22.05.2015


Jawaban (1)


Seperti yang saya sebutkan di komentar, kasus penggunaan di mana:

  • put(key, value) menambahkan Tuple hanya secara lokal
  • evict(key) mengeluarkannya dari semua peta

Benar-benar tidak transparan dan saya ragu Hazelcast (atau jaringan dalam memori populer lainnya) langsung mendukungnya, tetapi yang dapat Anda lakukan adalah menerapkan pub-sub yang sangat sederhana dengan Hazelcast. Pada setiap node hazelcast Anda memulai pendengar topik:

ITopic<String> eviction = hazelcast.getTopic("evict");
eviction.addMessageListener(new EvictionListener());

Di mana EvictionListener akan menjadi seperti:

public class EvictionListener implements MessageListener<String> {

   @Override
   public void onMessage(Message<String> message) {
      // Gets the local (per JVM) cache and evicts an entry from it
      Cache.getCache().evict(message.getMessageObject());
   }
}

Dan kemudian Anda dapat menerapkan metode penggusuran Anda sebagai:

public void evict(String key) {
    hazelcast.getTopic("evict").publish(key);
}

Sesuatu seperti ini. Maka Anda perlu membuat cache (seperti yang saya sebutkan Java Map sederhana atau cache Guava) per JVM dan menggunakan metode evict untuk penggusuran.

person Mateusz Dymczyk    schedule 01.04.2015
comment
Terima kasih! Saya ingat bahwa integrasi hibernasi menciptakan cache lokal. Mungkin akan melakukan implementasi berdasarkan itu, menggabungkan dengan tips Anda. - person ; 01.04.2015