Подтвердить что ты не робот

Какой хороший механизм связи с ведущим-ведомым на Java?

Я создаю приложение Java, которое требует взаимодействия ведущего-ведомого между JVM, возможно, находясь на одной физической машине. В сервере приложений Java EE (т.е. JBoss) будет находиться "главный" сервер, на котором к нему будут подключены "подчиненные" клиенты и динамически зарегистрировать себя для связи (то есть мастер не будет знать IP-адреса/порты ведомые устройства не могут быть заранее настроены). Главный сервер действует как контроллер, который будет работать с подчиненными устройствами, а подчиненные устройства будут периодически отвечать уведомлениями, поэтому будет двунаправленная связь.

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

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

  • RMI
  • JMS: встроенный в Java, "подчиненные" клиенты будут подключаться к существующему ConnectionFactory на сервере приложений.
  • JAX-WS/RS: как ведущий, так и ведомый будут серверами, отображающими интерфейс RPC для двунаправленной связи.
  • JGroups/Hazelcast: используйте общие распределенные структуры данных для облегчения связи.
  • Memcached/MongoDB: используйте их как "очереди" для облегчения связи, хотя клиенты должны были бы опросить, чтобы была какая-то латентность.
  • Thrift: похоже, он поддерживает постоянное соединение, но не уверен, как интегрировать/встраивать сервер Thrift в JBoss
  • WebSocket/Raw Socket: это сработает, но потребует гораздо больше настраиваемого кода, чем хотелось бы.

Есть ли какая-то технология, которую я пропускаю?

Изменить: Также посмотрел:

  • JMX: подключите клиент к JMX-серверу JBoss и получите уведомления JMX для двунаправленных сообщений.
4b9b3361

Ответ 1

Ну, я предлагаю JMS, если вы ищете что-то, основанное на Java. Он имеет все функции, которые вы ищете, плюс сильный сервер приложений, такой как JBoss. Однако другой вариант, который не полностью основан на Java и не использует Queues, будет использовать HTTP-протокол и JAXB (RESTful Web-сервисы). Это очень легкий способ общения между двумя сторонами. Ваши объекты будут преобразованы в XML с помощью JAXB и будут перенесены на другую сторону, а затем вы вернете его обратно к объекту после его получения.

Ответ 2

Честно говоря, я просто буду придерживаться JMS. У вас есть одна очередь, из которой ваши подчиненные могут принимать сообщения, и одну очередь, в которую они помещают. Вы можете установить свойства, которые обрабатывали каждое сообщение (для учета) прямо на конверте. Вы получаете упорство со многими поставщиками J2EE (glassfish, jboss).

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

Однако в некоторых случаях это может не соответствовать определению "низкая латентность".

Ответ 3

Еще два варианта:

Zookeeper (http://hadoop.apache.org/zookeeper/) Не использовал его, но звучит здесь. RabbitMQ (http://www.rabbitmq.com/) Очередь сообщений с малой задержкой. Здесь много гибкости.

Ответ 4

Если вы ищете производительность, и ваши приложения являются java, без межсетевого экрана, вы можете сразу исключить все протоколы на основе XML. Если связь является синхронной (мастер ждет, пока ведомое устройство выполнит задание), используйте RMI, иначе JMS. Вы также можете использовать TCP для максимальной производительности. Если есть много ведомых, которые получают одно и то же сообщение, вы можете посмотреть в инструментальные средства групповой коммуникации, такие как JGroups или Spread (быстрее, но не на 100% java). В конечном счете, вы можете обнаружить, что другие люди уже создали то, что вы пытаетесь построить. Взгляните на Gridgain.

Ответ 5

Вы также можете проверить Mule. Я чувствую, что это идеальное решение для вашей проблемы.

Ответ 6

У нас есть аналогичное приложение, и мы просто использовали Servlet на JBoss с "подчиненными", нажимая его по таймеру. Это нормально, но не оптимально для низкой латентности.

Теперь мы ищем Netty. Вы можете использовать любой протокол, который хотите использовать. Вероятно, мы будем использовать HTTP и JAXB. Я думаю, это можно было бы отнести к категории "WebSocket/Raw Socket", но это намного лучше, чем использование исходного файла.

Ответ 7

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

Ответ 8

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

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

Ответ 9

Для бережливости вы можете использовать TServlet в качестве точки входа для вашего сервиса Thrift. То, что вы описали, похоже, больше связано с проблемой, которую нужно решить с помощью activemq или zookeeper.

Ответ 10

WebSockets поможет вам в общении между веб-сервером и клиентом, а не между двумя JVM. Если это действительно то, что вы хотите, http://fermiframework.org предоставляет java для JavaScript (от сервера к клиенту) RMI.

Ответ 11

Вы также можете взглянуть на Redisson проект, который он публикует/подписывается и другие общие распределенные структуры данных для вас.