Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > HAZELCAST - в коллекции "залипает" неверное


Автор: CROTishka 30.5.2013, 12:14
Может кто работал/работает с хазелкастом?

Два потока, один пишет в хазелкаст инкрементящееся поле, второй неперерывно опрашивает коллекцию на предмет того, что в мапе лежит всё ещё старое значение (сверяет его по "эталонному" ConcurrentHashMap). Если обнаружено расхождение, то проверяющий поток засыпает на 100мс, и проверяет снова, и так 20 раз. Если и через 20 раз значение не обновилось, то умирает с кодом 100. По идее расхождение происходит часто, но умирать он никогда не должен. Однако, он может умереть как на втором инкременте, так и пару часов проработать нормально. Непонятно, баг хазелкаста ли это, или сконфигурено что-то не так.

Сорцы можно взять посмотреть тут: https://github.com/Kamapcuc/HazelcastTest 
на класспасс надо положить хазелкаст: http://www.hazelcast.com/files/hazelcast-2.5.1.zip

Автор: COVD 30.5.2013, 15:14
обновления коллекции можно обрабатывать с помощью лисенера, который надо зарегистрировать в коллекции, т.е. не обязательно периодически опрашивать. 

Автор: CROTishka 30.5.2013, 15:39
Проблема не в том, чтобы фиксировать изменения. Проблема в рассинхронизации данных на диске (в тесте роль диска выполняет ConcurrentHashMap и данных в кэше хазелкаста). При том, что данные пишутся одновременно и только в одном потоке.

Автор: COVD 30.5.2013, 17:20
Цитата

При том, что данные пишутся одновременно и только в одном потоке.
 
То, что вы наблюдаете, никакого отношения к хазелкасту не имеет. 
Один поток последовательно (а не "одновременно") обновляет 2 мапа, а другой поток последовательно читает значения из этих 2 мапов. Естественно, что значения могут не совпадать.
Убедитесь сами, заменив хазелкаст мап на обычный, и получите тот же эффект:
        
Код

Map<String, Integer> hazel = new ConcurrentHashMap<String, Integer>();//Const.instance.getMap("repo");
        ConcurrentHashMap<String, Integer> elastic = new ConcurrentHashMap<String, Integer>();

Автор: CROTishka 30.5.2013, 17:41
То, что они не совпадают в определённые моменты времени - это нормально. Поток после этого засыпает на время и проверяет заново и всё ок.
Не нормально, то, что иногда в этих двух мапах лежат разные значения, при том, что второй поток уже стоит. Читайте внимательнее, пожалуйста. Запустите и дождитесь "Process finished with exit code 100" - вывод в консоль добавлен просто для того чтобы было видно, что оно работает.

При этом если в конфиге хазелкаста  поменять <cache-value> на false, то всё работает нормально.

Добавлено через 2 минуты и 57 секунд
и если выставить hazel = new ConcurrentHashMap, то оно тоже никогда не упадёт и будет спиниться до тех пор, пока int не переполнится.

Автор: COVD 30.5.2013, 17:54
Цитата

При этом если в конфиге хазелкаста  поменять <cache-value> на false, то всё работает нормально. 

Обновление в хазелкасте по умолчанию более длительная операция, чем в обычном мапе, потому что он проверяет, есть ли удаленные узлы, которые надо синхронизировать. 

Автор: CROTishka 30.5.2013, 18:53
Вы о чём сейчас вообще?  :-(

Автор: COVD 30.5.2013, 19:40
Я, честно говоря, не совсем понял, что вы тестируете. Hazelcast я обычно тестирую, запуская два инстанса,  т.е. должно быть два метода main(), или два вызова одного main(). А дальше мы обновляем один инстанс мапа, а на другом инстансе смотрим обновилось или нет. Потому, что Hazelcast - это реализация распределенных коллекций. 

Вы же в разных потоках записываете и читаете из одного инстанса мапа. На мой взгляд тут проблема с обычной синхронизацией, т.к. никакой распределенности нет. Поэтому мап, который вы создаете через хазелкаст, это обычный мап, но, возможно, там вставка медленнее и это зависит от настроек хазелкаста. 

Вы обновляете значение ключа через put(), a другой поток через get() получает все время старое значение? 

Автор: CROTishka 4.6.2013, 14:22
:facepalm:

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)