| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 мапов. Естественно, что значения могут не совпадать. Убедитесь сами, заменив хазелкаст мап на обычный, и получите тот же эффект:
|
| Автор: 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 | ||
Обновление в хазелкасте по умолчанию более длительная операция, чем в обычном мапе, потому что он проверяет, есть ли удаленные узлы, которые надо синхронизировать. |
| Автор: 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: |