Событие 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();
        }
    }
    

    Проблема: Это прекрасно работает, когда разделение мозга объединяет два узла. Однако, используя четыре узла (два узла на машину на двух разных машинах), он уничтожает значения и, кажется, ведет себя случайным образом. Я подозреваю, что я понял что-то в общем-то неправильно, потому что этот подход не работает, как хотелось бы. Из-за этого я еще не анализировал поведение четырех узлов, а также анализирую четыре файла журнала.

0 ответов

Другие вопросы по тегам