Можно ли получить старое значение из карты после вставки нового? - PullRequest
0 голосов
/ 04 июля 2018

У меня есть кластер Hazelcast, который состоит из 4 узлов. Настройки выглядят так:

<hazelcast>
    ...
    <map name="default">
        <backup-count>1</backup-count>

        <async-backup-count>0</async-backup-count>

        <time-to-live-seconds>0</time-to-live-seconds>

        <eviction-policy>LRU</eviction-policy>

        <max-size policy="cluster_wide_map_size">5000</max-size>
    </map>
</hazelcast>

Наиболее важной частью является синхронное резервное копирование .

Я использую hazelcast iMap , например:

IMap<String, Object> map = getClient().getMap("default");
map.putAsync("key1", "1").get(1000, TimeUnit.MILLISECONDS);

//
String firstGet = map.getAsync("key1").get(1000, TimeUnit.MILLISECONDS);
map.putAsync("key1", firstGet + "2").get(1000, TimeUnit.MILLISECONDS);

// 
String secondGet = map.getAsync("key1").get(1000, TimeUnit.MILLISECONDS);
map.putAsync("key1", secondGet + "3").get(1000, TimeUnit.MILLISECONDS);

// 
String thirdGet = map.getAsync("key1").get(1000, TimeUnit.MILLISECONDS);

Я ожидаю, что thirdGet равно "123" . Но я получаю "13" очень редко. Похоже, что мое второе обновление в некоторых случаях теряется. Но я не вижу ошибок в логах.

Важно, чтобы эта ошибка появлялась, когда система имеет максимальное количество запросов.

Я думал о выселении кеша. Но в этом случае я бы потерял весь ключ. Но я потерял только второе обновление моего товара.

Также я знаю, что Hazelcast является продуктом AP. Но у меня синхронная репликация.

1 Ответ

0 голосов
/ 04 июля 2018

Ваш код на самом деле является хорошим примером для понимания асинхронного кода :), поскольку вы испытали асинхронные вызовы, это не гарантирует, что они вернутся, как только они будут отправлены, поэтому вы можете потерять заказ. В данный момент вы отправляете асинхронную операцию, ожидая не более 1000 мсек для завершения вычисления, а затем извлекаете ее результат, если он доступен. Некоторые могут вернуться через несколько мс, а другие не могут сделать это за 1000 мс. Вы просто получаете объект Future и ждете и говорите, что подождете всего 1000 мс до его завершения.

Вам нужно использовать операции синхронизации (map.put, map.get и т. Д.), Чтобы убедиться, что они завершены по возвращении. Используемый вами параметр резервного копирования IMap не связан с этим, он предназначен для создания резервных копий в режиме асинхронизации / синхронизации. Пожалуйста, смотрите: http://docs.hazelcast.org/docs/3.10.2/manual/html-single/index.html#backing-up-maps

...