在一个键值的大规模更新期间,我正在努力解决 Infinispan 缓存一致性问题。
我的缓存是这样定义的(我尝试了其他选项和组合但没有成功):
<replicated-cache name="refCounterCache" mode="SYNC" >
<locking isolation="READ_COMMITTED" write-skew="false"/>
<versioning scheme="SIMPLE"/>
</replicated-cache>
测试用例非常简单。在缓存上定义如下:
Cache<String, Integer> refernceCounterCache = cacheManager.getCache("refCounterCache");
在其中一个节点中,我将键的初始键值设置为 1000;
我调用每个节点代码,将键值增加 2000 倍:
IntStream.range(0, 2000).forEach(i -> {
try {
refernceCounterCache.merge(key, 1, (vOld, vNew) -> vNew + vOld);
}
catch (Exception ex) {
log.error("Unexpected error during value merge!");
}
});
当我在单节点集群(一个程序实例)上运行上述 lambda 代码时,一切都按预期工作(值 3000)。集群中的两个节点也是如此 - 我得到相同的预期结果:5000
当我有两个以上的节点时,问题就开始了。如果同时增加 3 个节点,我会得到意想不到的结果,例如6973而不是7000。
有谁知道问题出在哪里?也许是错误类型的缓存?也许错误的锁定选项?