Какую технологию Java RMI / RPC / IPC мне следует использовать? - PullRequest
6 голосов
/ 18 декабря 2010

Я разрабатываю приложение Java, которое состоит из сервера и клиента (возможно, нескольких клиентов в будущем), которые могут работать на разных хостах.

Для связи между этими двумя я в настоящее время использую собственный протокол, которыйсостоит из сообщений JSON, которые отправляются через сетевые сокеты и преобразуются обратно в объекты Java Bean с обеих сторон.Однако, чем сложнее становится приложение, я замечаю, что этот метод не соответствует моим стандартам и слишком сложен.

Я ищу надежную, возможно стандартизированную альтернативу.

I 'Я смотрел на Remote Method Invocation (RMI), но читал, что протокол медленный (большая нагрузка на сеть).

Технология, которую я ищу, должна быть легкой (протокол и библиотека), надежной, может поддерживать сжатие(большой плюс, если да!), возможно, поддерживает шифрование, хорошо документированный и хорошо зарекомендовавший себя (например, проект Apache).Это должно быть так же просто, как вызов метода для удаленного объекта с RMI, но без его недостатков.

Что вы можете порекомендовать?

Ответы [ 6 ]

5 голосов
/ 18 декабря 2010

Avro - проект Apache, разработанный для межязыкового RPC (см. Экономия для его духовного предшественника).Это довольно новый (менее двух лет), поэтому он не так хорошо известен, как RMI, например.Вы все еще должны дать ему шанс, хотя;крупные проекты, такие как Cassandra, переходят на Avro.Avro также является подпроектом в рамках Hadoop и получает здоровую поддержку от этого сообщества.

Он разработан, чтобы быть быстрым и поддерживать несколько языков, поэтому вам, вероятно, потребуется ввести еще один шаг во время компиляции, в который вы переводитефайл Avro IDL в Java, хотя это не является строго обязательным.Остальное - типичный RPC.

Одна хорошая вещь в Avro - это то, что ее транспортные уровни независимы от представления данных.Например, он поставляется с различными «приемопередатчиками» (их базовый класс связи) для необработанных сокетов, HTTP и даже локальных внутрипроцессных вызовов.Приемопередатчики HTTPS и SASL могут обеспечить безопасность.

Для представления данных существуют кодеры и декодеры различных типов, хотя по умолчанию BinaryEncoder обычно достаточно, поскольку Hadoop, Cassandra и т.эффективность.Также есть JsonEncoder на случай, если вы найдете это полезным.

2 голосов
/ 29 декабря 2010

Это действительно все зависит от того, какую совместимость вам требуется между клиентом и сервером.CORBA - это хорошо зарекомендовавший себя и стандартизированный способ взаимодействия между различными языками, но он требует немного больше усилий, чем Java RMI.Если клиенты работают из какого-либо внешнего ненадежного источника, то протокол на основе HTTP имеет больше смысла.Если вы будете следовать подходу REST, то впоследствии его будет легче масштабировать, поскольку вам нужно добавить больше серверов.

Если и клиент, и сервер являются Java, и они работают в доверенной сети, RMI отвечает вашим требованиям.за то, что "хорошо зарекомендовал себя".Повышение производительности RMI преувеличено, но очень ранние версии не объединяли соединения.

Если вы хотите отказаться от «хорошо установленных» и «стандартизированных», вы можете использовать Dirmi вместо RMI.Это быстрее, проще, имеет больше функций и не имеет проблем с брандмауэром, которые есть у RMI.Как и RMI, он поддерживает TLS (шифрование), но ни один не поддерживает встроенное сжатие.

Что бы вы ни выбрали, остерегайтесь блокировки.Попробуйте спроектировать свой сервер таким образом, чтобы уровень удаленного доступа был тонким слоем над кодом ядра.Это позволяет легко поддерживать несколько протоколов, возможно, одновременно.

1 голос
/ 19 декабря 2010

Серьезно, если вы не делаете веб-приложение, которое уже требует веб-багажа, вы действительно хотите RMI или, что еще лучше, CORBA. Я рекомендую JacORB (www.jacorb.org).

Игнорируйте общие утверждения о медленной / быстрой и выполняйте собственные тесты производительности.

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

Удачи.

1 голос
/ 18 декабря 2010

Считаете ли вы HTTP / REST?

Если это так, вы можете использовать что-то вроде Tomcat / Spring и при этом поддерживать все перечисленные вами требования (надежные, легкие, хорошо документированные, хорошо отработанные)

Протоколы на основе RPC простоустарелый.

1 голос
/ 18 декабря 2010

Mybe CORBA ?

0 голосов
/ 18 декабря 2010

Apache MINA библиотека для связи клиент-сервер и EJB3 подойдет лучше всего

...