Я создаю приложение 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 для двунаправленных сообщений.