Прослушиватели событий Hazelcast 3.8 EntryAdded или EntryUpdated НЕ вызываются, когда запись загружается из maptsore.

Я пытаюсь установить TTL для записи в IMap, которая загружается из cassandra mapStore. Для этого я реализовал EntryAdded и EntryUpdated eventlistener для IMap. Но эти методы не вызываются, когда я читаю данные из mapstore и возвращаю их в hazelcast.

Мои ожидания ошибочны? Если да, то каковы возможные решения для достижения этого?

Спасибо


person user2966021    schedule 11.09.2017    source источник


Ответы (2)


MapLoader.loadAll() будет генерировать событие ADDED при первоначальном заполнении IMap. После этого MapLoader.load() не будет генерировать событие ADDED для объектов, загружаемых впоследствии.

Это непоследовательно и регистрируется как проблема, https://github.com/hazelcast/hazelcast/issues/7771

Даже после того, как это будет исправлено, TTL при входе не будет отличаться от другого.

Для этого вы можете изучить шаблон проектирования "cache-aside", когда ваш код проверяет IMap на наличие данных и выполняет извлечение Cassandra и сохранение Hazelcast, что позволит использовать другой TTL для каждой записи.

person Neil Stevenson    schedule 11.09.2017
comment
Привет, спасибо за помощь. Я обнаружил, что есть проблема с подходом, который вы упомянули. Если я делаю Map.containsKey(key), то метод MapLoader.load() срабатывает и загружает запись в hazelcast из mapstore без ttl . Это не соответствует цели, которую я пытаюсь достичь. Я также не реализовал loadAllkeys. Хазелкаст версии 3.8 - person user2966021; 12.09.2017
comment
Что я имел в виду под cache-aside, так это то, что IMap не использует загрузчик карт. Ваш код выполняет IMap.containsKey, если результат ложен, ваш код загружается из Cassandra, а затем выполняет IMap.put. Тогда в этот момент ключ находится в IMap в любом случае, так что вы можете сделать IMap.get - person Neil Stevenson; 12.09.2017
comment
Похоже, это поведение загрузчика карт может быть улучшено, github.com/hazelcast/hazelcast/issues/11342< /а>. - person Neil Stevenson; 12.09.2017

Я не думаю, что возможно установить TTL при загрузке записи с помощью MapLoader. Ниже приведен подход, которому вы можете следовать: 1. Проверить, не находится ли запись в кеше. 2. Если нет в кеше - получить ее из хранилища данных. Используйте метод PUT, который позволит установить TTL. Вы можете обернуть эту логику внутри Hazelcast Callable, который можно настроить как разделяемый. Это сэкономит затраты на сеть, поскольку код будет выполняться на узле, где находятся данные.

person Hiten    schedule 11.09.2017