Синхронизация сообщений BlazeDS на двух веб-серверах
У меня есть веб-приложение Flex/BlazeDS (система управления псевдо-контентом) с бэкэндом Java, работающим на 2 серверах Weblogic 10.3 для балансировки нагрузки и обеспечения высокой доступности.
По сути, я использую опрос AMF для обновления своего приложения таким образом, чтобы при открытии пользователем документа из результатов поиска соответствующая строка отображала значок блокировки для всех пользовательских дисплеев, которые в данный момент имеют этот документ на экране.
У меня проблема в том, что если пользователь, подключенный к серверу A, открывает документ X, значок блокировки будет отображаться только на экранах других пользователей, подключенных к серверу A. Отображение пользователей, подключенных к серверу B, обновляться не будет. Существует ли какая-либо установленная парадигма или наилучшая практика, чтобы гарантировать, что заблокированное обновление будет распространяться на все серверы?
2 ответа
Самый простой способ - использовать блокировку, реализованную в базе данных (если вы уже используете базу данных в своем приложении).
Другое решение - реализовать сценарий издатель / подписчик и использовать функцию кластеризации BlazeDS, описанную здесь. Используя JGroups, BlazeDS можно настроить для работы в кластере, а сообщение, созданное издателем (заблокировать документ), будет распространено среди всех издателей.
Функции обмена сообщениями BlazeDS описаны здесь. Я все еще рекомендую первую версию (база данных).
Для более "экзотических" вариантов вы можете попробовать использовать ZooKeeper, Hazelcast и т. Д. Однако я бы не стал использовать их в вашем случае.
Я бы порекомендовал также использовать блокировку базы данных (вам нужен только логический флаг и чистую изоляцию транзакций) и распределенную тему JMS, чтобы отправлять событие блокировки всем другим пользователям. Я не знаю, если и как вы можете сделать это с BlazeDS, но было бы легко настроить такую архитектуру с GraniteDS.
По сути, когда пользователь запрашивает документ, транзакционный компонент на стороне сервера (скажем, EJB3) должен проверить, доступен ли ресурс, заблокировать его и опубликовать событие блокировки в распределенной теме JMS. Поскольку тема распределена, сообщение будет отправлено по всем вашим узлам WebLogic, и все подключенные пользователи, независимо от того, к какому кластерному узлу они подключены, будут проинформированы об этом событии через пользователей с длительным опросом. GraniteDS имеет хорошую поддержку асинхронных сервлетов WebLogic (см. GravityWebLogicServlet), и это даст вашим пользователям гораздо больше возможностей в режиме реального времени, чем с помощью простого опроса и без ущерба для масштабируемости (асинхронные сервлеты предназначены для использования в такого рода настройках).
Некоторые дополнительные ресурсы:
- Документация по обмену сообщениями в реальном времени для GraniteDS.
- Короткое видео о функциях кластеризации, высокой доступности и обмена сообщениями в GraniteDS (хотя с JBoss и базовым приложением чата).
Даже если вы не хотите или не можете использовать GraniteDS в своем проекте, я рекомендую рассмотреть эту распределенную тему JMS как лучшее и наиболее надежное решение вашей проблемы.