Несогласованность кеша 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.

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

0 ответов

Другие вопросы по тегам