Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Design, Quality, Testing > Нужен совет по архитектуре


Автор: Opik 27.2.2011, 05:05
Есть некая браузерная онлайн игра, запускаемая из консоли как standalone приложение. Для поднятия HTTP сервера используется apache mina, так же задействованы spring, velocity, ehcache.  Собирается это дело ant'ом.
Проблема в том, что с каждым добавлением функционала этот монолит разрастается, что не есть гуд. Так же проблема в том, что приложение иногда приходится перезапускать, "грохая" все сессии, даже если нужно поправить маленькую проблемку далеко где нибудь укромках игры. Что бы пользователи не вылетали совсем написаны костыли в виде сохранения текущего состояния в БД и с восстановлением при поднятии из последней. Опять же, при росте функционала данные костыли приходится добавлять, что так же не совсем хорошо. Это собственно суть проблемы.

Как вариант пути решения проблемы напрашивается модульность, или же разбитие монолита на несколько под серверов (чат сервер, сервер авторизации, хттп сервер, сервер команд и пр.) или же какое то ядро, с подключаемыми туда модулями...  Не знаю вообщем.
Может быть есть хорошие книги на эту тему? Или хотя бы какой совет. Гугл особого результата не дал.

Автор: COVD 27.2.2011, 10:19
Если коротко, то решение - "разбитие монолита на несколько" ... веб-приложений, т.е. war-ов. Их можно деплоить/андеплоить "на лету".

Формально, приложение следует строить на плагинной архитектуре, OSGi. Это позволяет обновлять (деплоить/андеплоить ) компоненты приложения "на лету", т.е. не останавливая приложения. И технологию OSGi внедряют в серверные приложения. Но на самом деле возможность запускать/останавливать модули уже давно реализована на веб-серверах.  Веб-сервер так работает с веб-приложениями, т.е. с war - ами. Поэтому простой и естественный способ перевести серверное приложение на плагинную архитектуру, это построить его как набор веб-приложений (war-ов). Естественность тут обеспечивается способом коммуникации клиента с веб-сервером, а именно "запрос-ответ". Для веб-приложений это  натуральный способ, а в  OSGi это реализуется искусственно, через интерфейсы, и OSGi берет на себя обеспечение синхронизации вызовов. Модуль перезагружается между вызовами. Точно также как и в веб-сервере, когда удаляется или добавляется war.

Однако клиент общается с сервером не только через "запрос-ответ". Клиент может также держать постоянное соединение с сервером. В этом случае перезапуск серверного приложения разорвет соединение. Клиент должен уметь автоматически возобновлять соединение. Это полезно, потому что разрыв постоянного соединения возможен по разным причинам, не только из-за перезапуска сервера.

В идеале, серверное приложение должно быть распределенным. Должно быть несколько дублирующих серверов. Чтобы в случае неудачи с одним сервером клиент имел возможность повторить попытку с другим сервером. Одновременно так решается и задача распределения нагрузки.

Автор: Opik 27.2.2011, 20:30
Спасибо за ответ. Буду рыть в сторону OSGi

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)