Я борюсь с непротиворечивостью кэша 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!");
}
});
Когда я запускаю вышеуказанный лямбда-код на кластере с одним узлом (один экземпляр программы), все работает как положено (значение 3000). То же самое для двух узлов в кластере - я получаю тот же ожидаемый результат: 5000
Проблема начинается, когда у меня более двух узлов. В случае одновременного увеличения 3 узлов я получаю неожиданные результаты, например, 6973 вместо 7000 .
Кто-нибудь знает, где проблема? Может быть неправильный тип кеша? Может быть, неправильные параметры блокировки?