![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
CROTishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 30.7.2009 Репутация: нет Всего: 2 |
Может кто работал/работает с хазелкастом?
Два потока, один пишет в хазелкаст инкрементящееся поле, второй неперерывно опрашивает коллекцию на предмет того, что в мапе лежит всё ещё старое значение (сверяет его по "эталонному" ConcurrentHashMap). Если обнаружено расхождение, то проверяющий поток засыпает на 100мс, и проверяет снова, и так 20 раз. Если и через 20 раз значение не обновилось, то умирает с кодом 100. По идее расхождение происходит часто, но умирать он никогда не должен. Однако, он может умереть как на втором инкременте, так и пару часов проработать нормально. Непонятно, баг хазелкаста ли это, или сконфигурено что-то не так. Сорцы можно взять посмотреть тут: https://github.com/Kamapcuc/HazelcastTest на класспасс надо положить хазелкаст: http://www.hazelcast.com/files/hazelcast-2.5.1.zip |
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
обновления коллекции можно обрабатывать с помощью лисенера, который надо зарегистрировать в коллекции, т.е. не обязательно периодически опрашивать.
|
|||
|
||||
CROTishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 30.7.2009 Репутация: нет Всего: 2 |
Проблема не в том, чтобы фиксировать изменения. Проблема в рассинхронизации данных на диске (в тесте роль диска выполняет ConcurrentHashMap и данных в кэше хазелкаста). При том, что данные пишутся одновременно и только в одном потоке.
|
|||
|
||||
COVD |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
То, что вы наблюдаете, никакого отношения к хазелкасту не имеет. Один поток последовательно (а не "одновременно") обновляет 2 мапа, а другой поток последовательно читает значения из этих 2 мапов. Естественно, что значения могут не совпадать. Убедитесь сами, заменив хазелкаст мап на обычный, и получите тот же эффект:
|
||||
|
|||||
CROTishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 30.7.2009 Репутация: нет Всего: 2 |
То, что они не совпадают в определённые моменты времени - это нормально. Поток после этого засыпает на время и проверяет заново и всё ок.
Не нормально, то, что иногда в этих двух мапах лежат разные значения, при том, что второй поток уже стоит. Читайте внимательнее, пожалуйста. Запустите и дождитесь "Process finished with exit code 100" - вывод в консоль добавлен просто для того чтобы было видно, что оно работает. При этом если в конфиге хазелкаста поменять <cache-value> на false, то всё работает нормально. Добавлено через 2 минуты и 57 секунд и если выставить hazel = new ConcurrentHashMap, то оно тоже никогда не упадёт и будет спиниться до тех пор, пока int не переполнится. |
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Обновление в хазелкасте по умолчанию более длительная операция, чем в обычном мапе, потому что он проверяет, есть ли удаленные узлы, которые надо синхронизировать. |
|||
|
||||
CROTishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 30.7.2009 Репутация: нет Всего: 2 |
Вы о чём сейчас вообще? :-(
|
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Я, честно говоря, не совсем понял, что вы тестируете. Hazelcast я обычно тестирую, запуская два инстанса, т.е. должно быть два метода main(), или два вызова одного main(). А дальше мы обновляем один инстанс мапа, а на другом инстансе смотрим обновилось или нет. Потому, что Hazelcast - это реализация распределенных коллекций.
Вы же в разных потоках записываете и читаете из одного инстанса мапа. На мой взгляд тут проблема с обычной синхронизацией, т.к. никакой распределенности нет. Поэтому мап, который вы создаете через хазелкаст, это обычный мап, но, возможно, там вставка медленнее и это зависит от настроек хазелкаста. Вы обновляете значение ключа через put(), a другой поток через get() получает все время старое значение? Это сообщение отредактировал(а) COVD - 30.5.2013, 20:02 |
|||
|
||||
CROTishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 30.7.2009 Репутация: нет Всего: 2 |
:facepalm:
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |