Java: RMI vs Web Services
Мне нужно создать распределенное приложение, состоящее из нескольких клиентов, которые отправляют файлы (а также информацию о файлах) на один сервер, также запрашивают этот сервер.
Клиенты должны получить доступ к этому веб-серверу изнутри компании для отправки файлов. Но иногда некоторые конкретные запросы должны запускаться за пределами компании.
Я думаю, что, учитывая то, что я знаю, RMI - это более быстрый (операционная производительность) способ подключения настольного клиента с движком индексирования и движком хранения. И я считаю, что создание веб-службы, обеспечивающей уровень доступа к поисковой системе, также является хорошим решением, поскольку оно будет работать за пределами сети компании.
Что вы думаете об этом? Хороший подход или у вас есть некоторые альтернативы, которые необходимо учитывать.
Спасибо заранее.
Ответы
Ответ 1
RMI может быть туннелирован через HTTP (см. здесь), поэтому не позволяйте так сильно влиять на ваше решение.
Если оба конца могут разговаривать с RMI, значит, RMI - это то, что вы должны использовать; гораздо легче работать, чем веб-сервис.
Ответ 2
Будьте осторожны, я недавно разработал подобное решение и обнаружил, что сокеты являются наиболее эффективным и перманентным способом передачи файлов, в то время как RMI хорош для простых вызовов методов (например, запросов). У меня также было трудное время для настройки RMI, конфигурация иногда может сбивать с толку, и там не так много документации по этому вопросу.
Я уверен, что RMI даст вам лучшую производительность по сравнению с веб-сервисами; но веб-службы, вероятно, будут более удобными и гибкими для будущих потребностей.
Ответ 3
Почему вы думаете, что RMI быстрее? По моему опыту, он может быть медленным, сложным в настройке, сложным для обеспечения безопасности и, как правило, неприятным для работы.
Так как веб-службы, как правило, просто XML через HTTP, вы можете, как правило, создать решение, которое будет лучше масштабироваться.
Ответ 4
Если API, который вы хотите поддерживать с помощью службы, не очень хорошо сопоставляется с HTTP, я бы выбрал для RMI (но остерегайтесь ненужных обращений в оба конца).
Если он действительно отображает на HTTP, я бы выбрал REST, который по сути является HTTP-сервлетами, реализующими ваш API в качестве действий. Если большая часть трафика - это загрузка/загрузка файлов, которые вы упомянули, в сочетании с несколькими вызовами API, это, вероятно, путь.
Кстати, ваш опыт в том, что RMI быстрее, чем веб-сервисы, совпадает с моим. (Оба варианта могут быть реализованы с низкой производительностью в результате, в основном, для двусторонних переходов в плохо разработанном API.)
Ответ 5
Это никогда не заканчивается. Вот мое скромное мнение:
- Веб-службы позволяют свободно сочетать архитектуру. С RMI вам нужно скомпилировать все, даже если произошли самые незначительные изменения (из-за серийных UUID классов и т.д.).
- WS позволяет упростить совместное использование с другими корпоративными компонентами (ESB, SSO, Identity Management, балансировка нагрузки, фильтры безопасности, сертификаты безопасности), поскольку HTTP является основным сетевым протоколом.
- Отражение в RMI (и в EJB) кажется более дорогим, чем сам протокол HTTP.
Если вы думаете о том, что EJB больше подходит для среды сервера приложений и проще сравнивать с WS и CORBA в соответствии с вашей статьей (EJB поддерживает управление транзакциями, управление bean, WS имеет расширения WS + (безопасность, транзакции)):
- EJB медленнее, чем WS согласно статье: Удаленный EJB в 3 раза медленнее, чем WebService в 7.1
- при компиляции/создании EJB нам приходилось использовать точно такую же версию сервера приложений, включая патчи на dev и production, чтобы избежать сомнительных ошибок времени выполнения (это выглядит просто: команда разработчиков (датацентр) не всегда говорит, какой патч они имеют, когда мы делаем исправления для приложения, нам всегда нужно заново спросить точную версию сервера).
- Частичные исправления приложения не так просты, если EJB перестроен из-за небольшого исправления, клиентские банки необходимо перестроить, поэтому приложениям, использующим клиентские банки, требуется перераспределение.
(Это были проблемы из моего опыта, возможно, другим людям повезло больше)
Я бы сделал вывод, что WebServices более гибкие, используют меньше рефлексии и, надеюсь, быстрее, если они будут тщательно разработаны. Если RESTful используется в MVC-контроллере в качестве результата, ESB может помочь как с предлагаемыми преобразованиями (меньше кода, просто преобразуется), так и с безопасностью непосредственно в заголовки HTTP (например, ivheader, ivgroup - при использовании веб-печати ibm, диспетчера доступа Tivoli). Использование SAML XACML возможно только при использовании WS, поскольку утверждения работают с XML. Поэтому для распределенных и дислоцированных корпоративных приложений WS более гибки из-за вышеупомянутого.
В статье, на которую вы ссылаетесь, говорится, что WS не имеет транзакций, а только предложения. Статья неправильная или слишком старая. См. OASIS WSAT 1.0 и WSAT 2.0. Microsoft, JBoss, Oracle и некоторые другие поддерживают технологию на своих серверах приложений. Кажется, что Apache Metro поддерживает его (пожалуйста, проверьте).
Ответ 6
RMI в основном используется для небольших приложений. Да, это быстрее, но с течением времени вы почувствуете, что для повышения эффективности вашего приложения при увеличении трафика webservice более удобен в обслуживании, чем RMI, и если вы выбрали веб-сервис REStFull, который будет лучшим вариантом.
Спасибо