Как спроектировать 2/3 уровня распределенного приложения на Java - PullRequest
0 голосов
/ 11 марта 2012

Я получил задание спроектировать распределенную систему, которая в основном состоит из одной централизованно разделяемой базы данных и нескольких толстых клиентов (графических интерфейсов на основе Swing), которые должны взаимодействовать с этой базой данных. Я в основном хочу администрировать некоторые адреса, сроки, задачи и т. Д. В настоящее время я использую Java 6 SE, JPA (eclipse-link) и базу данных MySQL. Сейчас я сталкиваюсь с некоторыми проблемами:

  • Как клиент 2 информируется об изменениях данных, внесенных в базу данных клиентом 1? Является ли хорошей идеей использовать подход RMI для обмена сообщениями?

  • Я имею дело с устаревшими данными, поскольку JPA EntityManager кэширует результаты запроса. Имеет ли смысл передавать сообщения «db-change» всем активным клиентам, чтобы они могли обновлять локально кэшированные объекты сущностей?

  • Существует ли гораздо более простой подход для достижения этих целей с использованием сервера приложений, такого как GlassFish? Или использование серверов приложений Java EE удобно только для веб-разработки? (извините за эти вопросы новичка, но я действительно не нашел четких ответов, читая документы по Java EE, или я просто не получил их: - / ...)

Любая помощь высоко ценится - большое спасибо заранее!

Ответы [ 4 ]

2 голосов
/ 12 марта 2012

Есть ли гораздо более простой подход для достижения этих целей с использованием сервера приложений, такого как GlassFish?

Это точная точка сервера приложений (которая отличается от веб-сервера).сервер) в 3-х уровневой настройке.Конечно, вы можете опрашивать и / или использовать обмен сообщениями для предоставления дополнительных перехватов для обмена метаданными (например, событие изменения базы данных), но в итоге вы плохо переизобретаете очень хорошо известное (и нетривиальное) колесо (например, синхронизацию данных в распределенном распределении).уровень).

Если вы можете жить без кэширования результатов запроса на клиенте и допустимы задержки доступа к серверу (2-й уровень) для доступа к данным, то ясно, что это путь.

[ниже довольно поздний ps, но случайно прочитал этот вопрос и вопрос сегодня и лично почувствовал, что это требует разъяснения.]

Java EE - это распределенная архитектура на основе контейнеров / компонентов для уровня предприятия.Оставляя в стороне неспособность рынка компонентов появиться для J2EE (хотя некоторые пытались это сделать), остается факт его COA и его неотъемлемая поддержка распространения как фундаментальная проблема архитектуры.Обратите внимание, что веб-профиль (например, «веб-сервер») Java EE также является частью той же архитектуры.

Итак, что вы получаете, когда используете один из этих серверов приложений Java EE и как он будет работатьВаше требование / проблемы дизайна.

Двумя важными ключевыми аспектами поддержки распространения, предлагаемой Java EE, являются ее (а) распределенное пространство имен (JNDI) и (б) его меню предложений для подключения по уровням (чистый RMI (где выразверните свою собственную распределенную систему на основе RPC), EJB-компоненты Enterprise Beans (удаленно и локально предоставляемые интерфейсы компонентов с четко определенной семантикой с точки зрения поиска и жизненного цикла в распространяемых контейнерах). Из разновидностей EJB, с точки зрения семантики соединения, вы имеетеобмен сообщениями (JMS) и прямой RPC.

В вашем случае вы можете, например, выбрать шину сообщений JMS как с конечными точками JMS толстого клиента, так и с EJB-компонентами MessageDrivenBean.домен обмена сообщениями как с темой / подпиской, так и с очередями прямого доступа. Они могут быть декларативно настроены как долговечные, или нет, и т. д.

Ваш сервер приложений c / предоставит этого JMS-провайдера, или вы можете выбратьлучший в своем роде, например, TIBCO, для ваших нужд, в соответствии с вашими требованиями.

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

Жизнеспособной альтернативой этому является составление того, что сводится к одной и той же вещи за вычетомПодход COA к Java EE (который дает вам декларативное волшебство и церемонию разработки pita) с автономным программным обеспечением OSS, например, ØMQ для вашей шины, удаленный RPC REST и, возможно, REDIS для повышения гарантий сохранности ваших сообщений и для координации (без JNDI..) ваши распределенные шары в воздухе.

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

Проект распределенной системы для предприятия («поставлен под задачу»)) необходимо учитывать бизнес-требования, выходящие за рамки предметной области.Это часть уравнения.

Надеюсь, что это полезно (и своевременно;)

1 голос
/ 20 апреля 2012

Ваши клиенты концептуально подключаются к «среднему уровню», который содержит «бизнес-логику».

enter image description here

Ваши клиенты отправляют все запросы на «средний уровень», а «средний уровень» выполняет их предварительную обработку. Это означает, что если средний уровень заботится о координации клиентов, средний уровень может запомнить, какие клиенты «просмотрели» важный объект, и (при условии, что технология поддерживает его) может передать обновление соответствующим клиентам.

Клиенты в основном содержат код для представления данных в этом сценарии, а код, который они содержат для приема запросов, в основном передает запрос на средний уровень.

1 голос
/ 11 марта 2012

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

1 голос
/ 11 марта 2012

Поскольку вы используете JPA, вы можете воспользоваться его механизмами блокировки и параллелизма сущностей .

Для JPA есть две основные концепции (цитируется по учебному руководству по Java EE 6):

Оптимистическая блокировка:

По умолчанию поставщики персистентности используют оптимистическую блокировку, где, перед внесением изменений в данные поставщик сохраняемости проверяет что никакая другая транзакция не изменила или не удалила данные с данные были прочитаны. Это достигается с помощью столбца версии в таблица базы данных с соответствующим атрибутом версии в объекте учебный класс. При изменении строки значение версии увеличивается.

Пессимистическая блокировка:

Пессимистическая блокировка идет дальше, чем оптимистическая блокировка. С пессимистическая блокировка, поставщик постоянства создает транзакцию который получает долгосрочную блокировку данных, пока транзакция выполнено, что не позволяет другим транзакциям изменять или удаление данных до завершения блокировки. Пессимистическая блокировка лучшая стратегия, чем оптимистическая блокировка, когда основные данные часто доступны и изменяются многими транзакциями.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...