Веб-сервисы против EJB против RMI, преимущества и недостатки? - PullRequest
54 голосов
/ 06 января 2010

Мой веб-сервер был бы быстро перегружен, если бы вся работа была выполнена там.Я собираюсь поставить второй сервер за ним для обработки данных.

В чем преимущество EJB над RMI или наоборот?

А как насчет веб-сервисов (SOAP, REST)?

Ответы [ 3 ]

116 голосов
/ 19 февраля 2010

EJB-компоненты построены поверх RMI. Оба подразумевают Java-клиенты и компоненты. Если ваши клиенты должны быть написаны в другом месте (например, .NET, PHP и т. Д.), Используйте веб-сервисы или что-то еще, что говорит о проводном протоколе, не зависящем от платформы, например, HTTP или XML через HTTP или SOAP.

Если вы выбираете RMI, вам не нужен сервер приложений Java EE EJB. Вы должны поддерживать синхронизацию клиентских и серверных JVM; вы не можете обновить клиент без обновления сервера. Вы должны написать все службы, которые сервер приложений EJB предоставляет для вас (например, пулы соединений, службы имен и каталогов, пулы, очереди запросов, транзакции и т. Д.).

RMI довольно низкий уровень, когда вы думаете об этом. Зачем тебе возвращаться обратно в CORBA?

Лучший выбор - EJB 3.0 против Spring. Это зависит от того, нравится ли вам разработка POJO, вы хотите, помимо всего прочего, выбрать реляционные технологии, помимо ORM и JPA.

Вы можете заплатить за сервер приложений Java EE (например, WebLogic, WebSphere) или использовать сервер с открытым исходным кодом (JBOSS, Glassfish и OpenEJB и ActiveMQ), или вы можете придерживаться Spring и развертывать его на Tomcat, Jetty, Resin или любой другой двигатель сервлета / JSP.

Spring предлагает широкий выбор, будучи независимым от технологий: постоянство (Hibernate, iBatis, JDBC, JDO, JPA, TopLink), удаленное взаимодействие (HTTP, Hessian, Burlap, RMI, SOAP веб-сервис) и т. Д.

EJB 3.0 - это спецификация многих поставщиков; Весну можно получить только из источника Spring.

Я бы порекомендовал Весна . Это очень твердо, имеет много тяги, никуда не денется. Он оставляет все ваши варианты открытыми.

Веб-сервисы хороши в теории, но есть некоторые ошибки, на которые нужно обратить внимание:

  1. Задержка. Первый закон распределенных объектов Фаулера: «Не надо!» Архитектура, состоящая из множества детализированных SOAP-сервисов, будет элегантной, красивой и медленной, как патока. Тщательно подумайте, прежде чем распространять.
  2. Переход от XML к объектам и обратно потребляет циклы ЦП, которые не обеспечивают никакой коммерческой ценности, кроме того, что позволяют вашим клиентам использовать протокол, не зависящий от платформы.
  3. SOAP - это стандарт, который с каждым днем ​​становится все более раздутым и сложным, но он имеет много инструментальной поддержки. Производителям это нравится, потому что это помогает стимулировать продажи ESB. ОТДЫХ прост, но не так хорошо понят. Это не поддерживается инструментами.

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

10 голосов
/ 06 января 2010

Между EJB и RMI EJB, безусловно, будет лучше - в нем есть все, что есть в RMI, и многое другое через контейнер (пул объектов, управление транзакциями и т. Д.)

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

Лично, если бы я делал это, я бы, вероятно, использовал EJB или какую-то аналогичную инфраструктуру удаленных объектов (также приходит на ум весеннее удаленное взаимодействие). Если вам нужна возможность вызывать объекты из не-Java-приложения, вы всегда можете использовать EJB-компоненты с простыми прокси-серверами веб-службы.

4 голосов
/ 19 февраля 2010

Re: веб-сервисы (SOAP, REST) Если ваши внутренние серверы не будут доступны общественности, вы не получите никакой выгоды от использования независимых от платформы интерфейсов веб-служб, таких как SOAP / REST.
Фактически, вы будете подвергнуты штрафу за все накладные расходы, добавленные тегами XML, обертывающими данные через удаленный вызов, не говоря уже о попадании, которое вы получите от маршалинга и демаршаллинга XML для объектов java.
Хотя любой распределенный вызов потребует некоторого уровня сериализации - даже RMI / EJB, но цена больше при сериализации в читаемый человеком XML.

Возможно, вам вообще не понадобится кодировать удаленные вызовы в java, вы можете запустить свою службу с простым экземпляром apache httpd, который настроен для балансировки нагрузки между несколькими серверами java, используя mod_jk или mod_proxy .
Эти модули могут использоваться для балансировки нагрузки между контейнерами сервлетов, такими как tomcat / jetty, или контейнерами ejb, такими как jboss / glassfish.

...