Hazelcast: Могу ли я настроить карту для каждой JVM?

Есть ли в Hazelcast какая-то возможность сделать значения кеша карты для каждого узла, а не копировать его состояние? Я думал, что в этом разница между getMap() и getDistributedMap(), но кажется, что оба реплицируются между узлами.

У меня есть приложение в кластере Weblogic, моя конфигурация:

<?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>

В журналах я вижу, что оба узла работают.

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

Когда я вызываю свой метод в первом узле, я вижу, что кеш добавлен

.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

Но во втором узле я вижу только журнал имени кеша, поэтому он использует уже добавленный кеш...

.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'}

Я пропустил какую-то конфигурацию? Можно ли добиться этого с помощью Hazelcast?


person Community    schedule 01.04.2015    source источник
comment
почему вы хотите использовать для этого Hazelcast вместо обычной карты Java (или кэша Guava или чего-то подобного)?   -  person Mateusz Dymczyk    schedule 01.04.2015
comment
Требование состоит в том, чтобы иметь возможность выполнять распределенное вытеснение, но не совместно использовать данные кэша.   -  person    schedule 01.04.2015
comment
так что вы хотите иметь возможность размещать вещи только локально, но когда вы выселяете, они должны выселяться на всех узлах? это не похоже на очень прозрачное решение. Не думайте, что hazelcast поддерживает это, думаю, вы могли бы легко реализовать это, используя ITopic hazelcast, публикуя выселение и имея прослушиватель на каждом узле.   -  person Mateusz Dymczyk    schedule 01.04.2015
comment
@MateuszDymczyk Да, я хочу использовать сеть для выполнения операций только тогда, когда это действительно необходимо. Попробую iTopic, спасибо!   -  person    schedule 01.04.2015
comment
@SérgioMichels, скажите, пожалуйста, как вам удалось настроить slf4j для входа в режим DEBUG? Можете посмотреть здесь stackoverflow.com/questions/30391834/ пожалуйста?   -  person VB_    schedule 22.05.2015


Ответы (1)


Как я уже упоминал в комментарии, случай использования, когда:

  • put(key, value) добавляет кортеж только локально
  • evict(key) вытесняет его со всех карт

На самом деле это не так прозрачно, и я сомневаюсь, что Hazelcast (или любая популярная сетка в памяти) поддерживает его из коробки, но вы можете реализовать очень простой pub-sub с помощью Hazelcast. На каждом узле hazelcast вы запускаете прослушиватель темы:

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

Где EvictionListener будет что-то вроде:

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());
   }
}

И тогда вы можете реализовать свой метод выселения как:

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

Что-то вроде этого. Затем вам нужно создать кеш (как я упомянул простую карту Java или кеш Guava) для каждой JVM и использовать метод evict для выселения.

person Mateusz Dymczyk    schedule 01.04.2015
comment
Спасибо! Я вспомнил, что интеграция со спящим режимом создает локальный кеш. Возможно, сделаю реализацию на основе этого, совместив с вашими советами. - person ; 01.04.2015