2017-02-10 20 views
0

RMI - это API программирования сети Java, который использует JRMP protocol. Если мы анализируем пакеты с Wireshark, это показывает, что для установления связи между клиентом и сервером для протокола JRMP требуется как минимум 2 обмена сообщениями.Возможно ли использовать RMI с балансировщиком с круговым распределением в распределенной среде?

Подробнее: Первый запрос обмена - это этап согласования, второй обмен запросами - шаг lookup(), тогда другие обмены запросов - это вызовы удаленной процедуры (когда мы используем методы из нашего класса, который расширяет Remote). Первый вызов удаленной процедуры содержит имена атрибутов сериализованного класса, если один и тот же метод вызывается во второй раз, будут некоторые оптимизации (для каждого имени атрибута будет использоваться integer id вместо String).

Меньше деталей: JRMP является сложным, поскольку ему требуется несколько обменов запросов клиентов и серверов. Для протокола, такого как HTTP, требуется только одно.

Считаем, что мы работаем над облаком, у нас есть несколько узлов с серверами RMI, у нас также есть уравновешивающий баланс нагрузки между клиентами RMI и нашим облаком. Клиент RMI отправляет запрос на согласование, и первый узел получает его, затем балансировщик нагрузки отправляет запрос lookup() ко второму узлу ... Возможно ли использовать RMI в распределенной среде?

+2

Теоретически, есть ли веская причина в такой ситуации, чтобы не использовать интерфейс HTTP или обмена сообщениями? – chrylis

+0

Привет, да, есть веская причина: если мы хотим использовать синхронную реализацию служебной ориентированной архитектуры (SOA), которая построена на двоичном протоколе (а не на обычном текстовом протоколе, таком как HTTP, который требует больше ЦП для сложных данных). – Gugelhupf

+0

Процессорное время для сериализации/десериализации в наши дни тривиально дешево. Простота отладки стоит накладных расходов. – chrylis

ответ

1

Первый обмен запрос является шагом переговорами, второй обмен запроса является lookup() шага

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

RMI клиент отправляет запрос согласования и первый узел получает его, то балансировки нагрузки отправить lookup() запрос на второй узел ...

Не возможно. Оба запроса перемещаются по одному и тому же TCP-соединению, ergo к тому же целевому хосту.

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

Не обязательно. Запросы к целевому объекту могут проходить через другое соединение: ergo они могут включать в себя другой этап переговоров. Они также могут перейти на другой хост от первого целевого хоста, независимо от наличия или отсутствия балансировки нагрузки.

Возможно ли использование RMI в распределенной среде?

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

Возможно, вам будет лучше использовать RMI/IIOP и балансировку нагрузки ORB.