我将Apache Ignite用于以下设置:
2个服务器组成一个群集,其中多个Ignite缓存以REPLICATED
模式配置。还有10个Java进程作为客户端连接到Apache Ignite集群并从那些缓存中获取数据。
使用VisualVM对客户端JVM进行性能分析时,我看到客户端在下一行上花费了将近一半的时间
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(),因为在我的情况下,初始加载后缓存中将没有更新?
答案 0 :(得分:1)
通常,这是可以预期的,因为您需要等待网络至少将高速缓存值传递到客户端节点。 REPLICATED
缓存模式意味着每个服务器节点上都存在每个密钥,但是将其拉到客户端节点仍需要一些时间。