根据环境,我们有一个在1或2个节点上运行的应用程序,并且具有基于Hazelcast的共享缓存。
应用程序上的请求之一在此缓存上触发了大约1000个请求(所有缓存命中)。
在单节点配置中,这很好地工作。具体来说,每个请求占用的时间少于10毫秒。
但是,如果我们使用2个节点,则每个缓存请求大约需要20-200ms。我们认为这是由于Hazelcast从远程节点获取数据而引起的,这当然涉及网络流量。因此,我们将其配置为使用NearCache,据我们了解,该缓存应导致与单个本地缓存大约相同的访问速度。但这并没有,它似乎完全没有影响性能。
所以现在我想知道:
如何检查NearCache配置是否真正起作用?
如何获得接近本地缓存的读取性能,但如何(异步)将更新传递给所有远程缓存(我认为可以通过配置NearCache来获得)?
我们使用以下配置初始化缓存:
HazelcastConfiguration.getOrCreateCache(
cacheName,
new CacheConfig<K, CR>()
.setNearCacheConfig(new NearCacheConfig())
.setExpiryPolicyFactory(
HazelcastConfiguration.createExpiryPolicyFactory(expiryAfterModification)),
cacheManager
);
最佳答案
这取决于很多事情,但是20 / 200ms很大。当我们在1个标准1 GbE网络上运行4节点群集基准测试(4个双插槽xeon计算机)时,99%远远低于1毫秒。我们在这里谈论的没有Nearcache。
Near缓存应该提供非常好的性能,因为如果数据是本地缓存的,则调用是本地的+跳过了用于执行操作的整个内部基础结构(至少对于IMap和Near缓存;不完全了解Cache。
您可以尝试敲相同的键吗?只是为了确保您快到高速缓存了。
您使用什么作为关键和价值?它们很大还是序列化不友好?
我您仍然遇到问题;快速尝试使用IMap并启用近缓存,并检查是否存在较大差异。
关于java - Hazelcast NearCache对性能没有预期的影响,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30890393/