Несогласованность кэша Infinispan для массовых параллельных операций - PullRequest
0 голосов
/ 12 июня 2019

Я борюсь с непротиворечивостью кэша 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 .

Кто-нибудь знает, где проблема? Может быть неправильный тип кеша? Может быть, неправильные параметры блокировки?

...