Передача и синхронизация данных для высокопроизводительного распределенного приложения Java EE с высокой доступностью
Прежде чем я начну со своих вопросов, позвольте мне немного рассказать об архитектуре, которую мы должны использовать:
У нас будет один центральный экземпляр приложения.
- этот экземпляр приложения разворачивается с помощью веб-приложения бизнес-администрирования - оно используется для изменения "внутренних" данных (об этом я сейчас расскажу)
- этот экземпляр приложения на самом деле является кластером серверов
У нас будет n (n > 0 && n <= 3000) экземпляров локальных приложений - 1 для каждого "местоположения"
- эти экземпляры служат обработчиками данных для их местоположения
- этот экземпляр не использует полный набор центральных данных - только подмножество, ограниченное тем, что необходимо для обработки данных
- каждое местоположение может (и мы должны этого ожидать) отключаться на длительные периоды времени (скажем, на 2 недели сверху)
Каждое местоположение будет иметь несколько сотен "клиентов" (скажем, до 300) - внешние приложения, которые будут предоставлять данные для обработки
Теперь собираем все вместе: если местоположение находится в сети, клиенты могут общаться либо с локальным экземпляром, либо с центральным. Однако, если местоположение находится в автономном режиме, центральное недоступно, и клиенты могут общаться только с локальным экземпляром. В таких случаях локальные экземпляры должны обрабатывать данные, как если бы они были центральными (в соответствии с правилами, определенными в центральном - "внутренние" данные, о которых я говорил ранее), кэшировать результат, а когда местоположение становится подключенным, синхронизировать его с Центральный (только результат, без пересчета на Центральный). В то же время локальные экземпляры должны всегда синхронизировать свои "внутренние" данные с Central (когда они находятся в сети, если они находятся в автономном режиме, мы предполагаем, что данные "свежие", если время в автономном режиме не превысило пороговое значение 2 недели). Или, глядя на это с другой стороны - всякий раз, когда что-то меняется в Central, его нужно отправить во все доступные локальные экземпляры.
Итак, чтобы подвести итог (и, наконец, задать мой вопрос), нам нужен способ синхронизации данных из центрального экземпляра с несколькими тысячами локальных экземпляров, нам также нужен способ отправки локальных изменений в центральный. Учитывая количество локальных экземпляров, возможный высокий трафик (каждый локальный может иметь до 300 клиентов, каждый клиент может генерировать несколько запросов в минуту, вычисление каждого запроса может занять много времени, и результат может быть большим)) и все другие ограничения (например, центральный экземпляр будет кластером серверов Weblogic, но каждый Local будет одним WildFly, базы данных также будут разными для Central и Local - включая разные схемы, что будет лучшим подходом для этого взаимодействия а проблема с синхронизацией?
1 ответ
Похоже, что шаблоны сообщений брокера были бы наиболее подходящими здесь. Для направления "местные жители -> центральное" вы можете накапливать изменения в локально сохраненных двухточечных сообщениях, адресованных центральному серверу, которые отправляются во время онлайн-периодов. Для этой цели вы можете использовать локальную долговременную очередь сообщений. Для изменений, инициированных центральным сервером, вы можете использовать шаблон публикация / подписчик с гарантированной доставкой. Разрешение конфликтующих изменений зависит от вашей бизнес-логики.