Данные загрузки Hazelcast из СУБД в топологии клиент-сервер

Я использую топологию клиент-сервер для кеширования hazelcast. У меня есть несколько карт, которые я с нетерпением загружаю с помощью MapLoaders. Когда происходит ошибка кеша - вызывается метод загрузки (ключа) Maploader. Кажется, что метод MapLoader.load (key) выполняется потоком раздела, что означает, что все другие операции с разделом блокируются до завершения загрузки. Очень распространенный вариант использования MapLoader - загрузка данных из БД, что, возможно, может занять некоторое время. Итак, каков наилучший подход, чтобы другие операции с разделом не блокировались во время выполнения laod? Есть ли другой способ загрузить недостающие данные во время выполнения? (Версия Hazelcast: Hazelcast 4.0.3)


person Priyanka    schedule 20.03.2021    source источник


Ответы (1)


На этот вопрос есть хороший ответ, который дает несколько вариантов.

MapLoader.load(key) загружает только одну запись, но если удаленный источник работает очень медленно или много промахов в кэше, он будет установлен.

Другой альтернативой ответу @mike-yawn было бы наличие Runnable, которое извлекает необходимые элементы из базы данных и записывает их прямо на карту. У вас все еще может быть MapLoader.load(key), но вероятность промаха кеша снижается, если ваш код сборщика хорошо предсказывает, какие записи потребуются.

Если вы не кэшируете 100% записей, то промах кеша неизбежен. Если это слишком медленно, вы всегда можете вернуть Entry.Value, который содержит какой-то флаг, указывающий на то, что это заполнитель, и запустить поток для фактической загрузки. Затем ваш код должен иметь дело с этим заполнителем и повторить попытку позже, отмечая, что, когда он попытается позже, конечным результатом запроса к базе данных может быть отсутствие записи.

person Neil Stevenson    schedule 20.03.2021
comment
Спасибо @Neil Stevenson за ваш ответ. Для активной загрузки кеша есть больше возможностей, чем загрузчик карт. Сейчас я загружаю около 8 карт, и это занимает около 7,5 минут. - person Priyanka; 21.03.2021
comment
У вас есть время для ваших loadAllKeys() и loadAll(Collection<K>) методов? Если база данных работает очень медленно, лучше всего избегать перезапуска. - person Neil Stevenson; 22.03.2021
comment
Есть и другой вариант, но он в коммерческой версии. - person Neil Stevenson; 22.03.2021
comment
Для активной загрузки кеша рассмотрите также возможность использования движка Jet в качестве массового параллельного ETL для Hazelcast. Он может работать как автономный кластер (выключается после заполнения кеша) или внутри Hazelcast (вы запускаете кластер Jet вместо кластера Hz). Примеры кода: github.com/hazelcast/hazelcast -jet / tree / master / - person Vlado Schreiner; 22.03.2021