Я использую Apache Ignite со следующей настройкой:
2 сервера образуют кластер с несколькими кешами Ignite, настроенными в режиме REPLICATED
. Существует также 10 процессов Java, которые подключаются к кластеру Apache Ignite в качестве клиентов и получают данные из этих кэшей.
При профилировании клиентских JVM с помощью VisualVM я вижу, что клиенты проводят почти половину своего времени в заблокированном режиме в следующей строке
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304)
at org.apache.ignite.internal.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:178)
at org.apache.ignite.internal.util.future.GridFutureAdapter.get(GridFutureAdapter.java:141)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter.get0(GridCacheAdapter.java:4723)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter.get(GridCacheAdapter.java:4697)
at org.apache.ignite.internal.processors.cache.GridCacheAdapter.get(GridCacheAdapter.java:1415)
at org.apache.ignite.internal.processors.cache.IgniteCacheProxyImpl.get(IgniteCacheProxyImpl.java:928)
at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.get(GatewayProtectedCacheProxy.java:640)
Я понимаю, что блокировка может понадобиться для правильной обработки get () / put () для данного ключа в заданном кеше. Но в моем приложении я сначала загружаю все необходимые справочные данные в кеш Ignite, а после этого клиентские JVM получают данные только из кеша. Ожидается ли такое поведение (тратить много времени на ОЖИДАНИЕ во время cache.get ())? Есть ли способ вызвать cache.get () без блокировки, так как в моем случае не будет обновлений в кеше после начальной загрузки?