Лучший Java поддерживает сервер / клиентский протокол? - PullRequest
0 голосов
/ 16 января 2009

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

Функции, которые должна предлагать библиотека:

  • клиент и сервер функциональность
  • должно работать на основе сообщений
  • поддержка многопоточность
  • должен работать за балансировщиком нагрузки / межсетевыми экранами

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

Любые идеи высоко ценятся.


Подробнее

Моя идея состоит в том, чтобы реализовать оболочку клиент / сервер, которая обрабатывает взаимодействие с клиентом (включая проверку имени пользователя и пароля) и записывает входящие запросы в очередь JMS:

#1  User --> Wrapper (Check for user/password) --> JMS --> "Server"
#2  User polls Wrapper which polls JMS

Отдельные процессы будут обрабатывать запросы и могут отвечать клиентам через оболочку. Я хотел бы использовать JMS, потому что:

  • очень хорошо справляется с постоянством
  • балансировка нагрузки - легко обрабатывать пики, добавляя дополнительные серверы в качестве потребителя
  • JMSTimeToLive тоже пригодится

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

Ответы [ 7 ]

3 голосов
/ 16 января 2009

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

2 голосов
/ 16 января 2009

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

Если вы в конечном итоге используете это, не забывайте всегда устанавливать последовательную версию класса, который распространяется на клиента. Вы можете установить его на 1 л, когда создаете его, или если у клиента уже есть класс, используйте serialver.exe для обнаружения серийного номера существующего класса. В противном случае, как только вы измените или добавите открытый метод или переменная совместимость с существующими клиентами нарушится.

статический финал long serialVersionUID = 1L

РЕДАКТИРОВАТЬ: каждый запрос RMI, поступающий на сервер, получает свой собственный поток. Вы не должны справляться с этим самостоятельно.

РЕДАКТИРОВАТЬ: Я думаю, что некоторые детали были добавлены позже в вопросе. Вы можете туннелировать RMI через HTTP, а затем использовать балансировщик нагрузки.

Я недавно начал играть с Гессианом, и это очень многообещающе. Он изначально использует HTTP, что делает его проще, чем RMI по HTTP, и это двоичный протокол, что означает, что он быстрее, чем все протоколы на основе XML. Начать работать с Гессианом очень легко. Недавно я сделал это, внедрив Jetty в наше приложение, настроив сервлет Hessian и заставив его реализовать наш интерфейс API. Самое замечательное в Hessian - это простота ... ничего похожего на JMS или RMI через HTTP. Существуют также библиотеки для гессенского языка на других языках.

1 голос
/ 16 января 2009

Используйте Spring .... Затем выберите и выберите протокол.

1 голос
/ 16 января 2009

Вы пробовали RMI или CORBA ? С ними обоими вы можете распространять свою логику и создавать сеансы

1 голос
/ 16 января 2009

Трудно сделать предложение на основе предоставленной информации, но возможно использование TemporaryQueues, например. динамически создаваемые назначения PTP для каждого клиента могут соответствовать проблеме?

Здесь - разумный обзор.

1 голос
/ 16 января 2009

Я бы сказал, что наиболее поддерживаемым, если не лучшим образом реализованным, клиент-серверным коммуникационным пакетом для Java является Sun RMI (Remote Method Invocation). Он включен в стандартную библиотеку классов Java и выполняет свою работу, даже если это не самый быстрый вариант. И, конечно же, это поддерживается Sun. Я реализовал пошаговую игровую среду с ней несколько лет назад, и она была довольно стабильной.

0 голосов
/ 16 января 2009

Мы стандартизируем Adobe AMF, так как мы используем Adobe Flex / AIR на уровне клиента и Java6 / Tomcat6 / BlazeDS / Spring-Framework2.5 / iBATIS2.3.4 / ActiveMQ-JMS5.2 в нашем среднем стек уровней (серверная часть Oracle 10g).

Поскольку мы стандартизируем разработку на стороне клиента Flex, AMF и BlazeDS (теперь они лучше связаны с Spring благодаря сотрудничеству Adobe и SpringSource в области интеграции) являются наиболее эффективным и удобным средством взаимодействия с сервером. -side.

Мы также в значительной степени опираемся на обмен сообщениями JMS в центре обработки данных - BlazeDS позволяет нам связывать наших клиентов Flex как подписчиков тем JMS. Это очень мощный и эффективный.

Наш код Flex .swf и Java .class объединен в один файл .jar для развертывания. Таким образом будет развернута правильная версия клиентского кода для взаимодействия с соответствующим Java-кодом среднего уровня, который будет обрабатывать вызовы клиентских служб (или операции обмена сообщениями). Это всегда было проблемой клиент-серверных вычислений - чтобы убедиться, что правильные версии соответствующих уровней подключены друг к другу. Мы эффективно решили эту давнюю проблему с помощью нашего особого подхода к пакетированию и развертыванию.

Все наши клиент-серверные взаимодействия работают через HTTP / HTTPS-порты 80 и 443. Даже передача сообщений на стороне сервера, которую мы делаем с BlazeDS, соединенной с нашим брокером сообщений ActiveMQ JMS.

...