Несогласованность кеша Infinispan для массовых одновременных операций
Я борюсь с согласованностью кеша 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.
Кто-нибудь знает, в чем проблема? Может неправильный тип кеша? Может неправильные варианты блокировки?