Как использовать AtomicLong в подсистеме Hazelcast CP всего с двумя узлами кластера Hazelcast?
Я обновляюсь до последней версии Hazelcast [3.12] и сталкиваюсь с проблемой получения экземпляра AtomicLong. В новой версии HZ вводится концепция теоремы CAP, чтобы обеспечить согласованность и допуск раздела, но проблема в том, что подсистема CP должна иметь как минимум 3 члена.
Config config = new Config();
config.getCPSubsystemConfig().setCPMemberCount(3);
config.getCPSubsystemConfig().setGroupSize(3);
HazelcastInstance instance1 = Hazelcast.newHazelcastInstance(config);
Как я могу настроить подсистему CP, чтобы предоставить мне экземпляр atomicLong всего с двумя узлами Hazelcast?
Если я запускаю свое приложение только с одним узлом, выводится следующее сообщение:
MetadataRaftGroupManager.log: 65 [127.0.0.1]: 6000 [dev] [3.12] Подсистема CP ожидает подключения трех членов к кластеру. Текущее количество участников: 1
У меня будет только два узла, поэтому подсистема CP не позволяет мне использовать atomicLong, потому что она будет ждать вечно по крайней мере 3 узла.
Версия 3.11, которую я только что назвал hazelcast.getAtomicLong("count")
, Как я могу справиться с этим?
1 ответ
Подсистема CP не может быть сконфигурирована для работы с менее чем 3 узлами, потому что это принесет в жертву "согласованность", которая является всей целью подсистемы CP при некоторых сценариях сбоя (разбиение сети).
Вы по-прежнему можете использовать API 3.11, поэтому код из вашей реализации 3.11 продолжит работать. Хотя API 3.11 помечены как устаревшие, они не удаляются и не отключаются; устаревание - это предупреждение о том, что API-интерфейсы, как известно, уязвимы для проблем согласованности в сценарии с разделением мозгов. Некоторый код приложения терпим к таким проблемам, и уязвимость не является проблемой; если ваше приложение не терпит потенциальной проблемы согласованности с атомарным длинным, то потребуется добавить дополнительный узел для перехода на реализацию CP.