Событие ReplicatedMap EntryListener при объединении разделенного мозга
Я использую ReplicatedMap<String, String>
в моем кластере Hazelcast. У каждого узла есть свой ключ (hazelcastInstance.getLocalEndpoint().getUuid()
) и некоторые данные (строка JSON) на этой карте. Используя эту карту, я реализовал сервис, в котором каждый узел имеет свое хранилище данных, может получать доступ к данным других узлов и наблюдать за изменениями.
Однако я изо всех сил пытаюсь понять правильное поведение расщепленного мозга.
Я хотел бы получить entryAdded
или же entryUpdated
событие на моем EntryListener
прикреплен к ReplicatedMap
когда происходит разделение мозга. Однако, это не так. Я предполагаю, что это по замыслу (?).
Какие решения вы могли бы представить, чтобы решить эту проблему?
Идеи:
MembershipListener
может обнаружить разделение мозга слияния. Проблема: данные вReplicatedMap
еще не обязательно готов - он может быть готов до или послеmemberAdded
событие называется.Воплощать в жизнь
MergePolicy
Например:public Object merge(String mapName, ReplicatedMapEntryView mergingEntry, ReplicatedMapEntryView existingEntry) { // every node knows its own values! (somehow existingEntry and mergingEntry are swapped?) // mergingEntry seems to be the destination (current local value) // existingEntry seems to be the value from the other member if (mergingEntry.getKey().equals(hazelcastUuid)) { return mergingEntry.getValue(); } else { return existingEntry.getValue(); } }
Проблема: Это прекрасно работает, когда разделение мозга объединяет два узла. Однако, используя четыре узла (два узла на машину на двух разных машинах), он уничтожает значения и, кажется, ведет себя случайным образом. Я подозреваю, что я понял что-то в общем-то неправильно, потому что этот подход не работает, как хотелось бы. Из-за этого я еще не анализировал поведение четырех узлов, а также анализирую четыре файла журнала.