Передача и синхронизация данных для высокопроизводительного распределенного приложения Java EE с высокой доступностью

Прежде чем я начну со своих вопросов, позвольте мне немного рассказать об архитектуре, которую мы должны использовать:

  • У нас будет один центральный экземпляр приложения.

    • этот экземпляр приложения разворачивается с помощью веб-приложения бизнес-администрирования - оно используется для изменения "внутренних" данных (об этом я сейчас расскажу)
    • этот экземпляр приложения на самом деле является кластером серверов
  • У нас будет n (n > 0 && n <= 3000) экземпляров локальных приложений - 1 для каждого "местоположения"

    • эти экземпляры служат обработчиками данных для их местоположения
    • этот экземпляр не использует полный набор центральных данных - только подмножество, ограниченное тем, что необходимо для обработки данных
    • каждое местоположение может (и мы должны этого ожидать) отключаться на длительные периоды времени (скажем, на 2 недели сверху)
  • Каждое местоположение будет иметь несколько сотен "клиентов" (скажем, до 300) - внешние приложения, которые будут предоставлять данные для обработки

Теперь собираем все вместе: если местоположение находится в сети, клиенты могут общаться либо с локальным экземпляром, либо с центральным. Однако, если местоположение находится в автономном режиме, центральное недоступно, и клиенты могут общаться только с локальным экземпляром. В таких случаях локальные экземпляры должны обрабатывать данные, как если бы они были центральными (в соответствии с правилами, определенными в центральном - "внутренние" данные, о которых я говорил ранее), кэшировать результат, а когда местоположение становится подключенным, синхронизировать его с Центральный (только результат, без пересчета на Центральный). В то же время локальные экземпляры должны всегда синхронизировать свои "внутренние" данные с Central (когда они находятся в сети, если они находятся в автономном режиме, мы предполагаем, что данные "свежие", если время в автономном режиме не превысило пороговое значение 2 недели). Или, глядя на это с другой стороны - всякий раз, когда что-то меняется в Central, его нужно отправить во все доступные локальные экземпляры.

Итак, чтобы подвести итог (и, наконец, задать мой вопрос), нам нужен способ синхронизации данных из центрального экземпляра с несколькими тысячами локальных экземпляров, нам также нужен способ отправки локальных изменений в центральный. Учитывая количество локальных экземпляров, возможный высокий трафик (каждый локальный может иметь до 300 клиентов, каждый клиент может генерировать несколько запросов в минуту, вычисление каждого запроса может занять много времени, и результат может быть большим)) и все другие ограничения (например, центральный экземпляр будет кластером серверов Weblogic, но каждый Local будет одним WildFly, базы данных также будут разными для Central и Local - включая разные схемы, что будет лучшим подходом для этого взаимодействия а проблема с синхронизацией?

1 ответ

Похоже, что шаблоны сообщений брокера были бы наиболее подходящими здесь. Для направления "местные жители -> центральное" вы можете накапливать изменения в локально сохраненных двухточечных сообщениях, адресованных центральному серверу, которые отправляются во время онлайн-периодов. Для этой цели вы можете использовать локальную долговременную очередь сообщений. Для изменений, инициированных центральным сервером, вы можете использовать шаблон публикация / подписчик с гарантированной доставкой. Разрешение конфликтующих изменений зависит от вашей бизнес-логики.

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