Единичный NIO канал или пул NIO каналов для обмена данными между сервисами на одном сервере?

Здравствуйте!



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



Сервисы работают на компьютере с Ubuntu, написаны на Java, обмен информацией будет происходить множеством пакетов разного размера (от 50 байт до 100 килобайт). Возможно количество сервисов больше двух и соотношение «один ко многим».



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



Навскидку вижу три варианта:

1. Открыть между каждыми двумя приложениями один канал и вести обмен по нему.

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

3. Открывать на каждый сеанс персональный канал, вести обмен через него, а по завершении сеанса закрывать.



Что посоветуете?



Спасибо.
  • Вопрос задан
  • 3225 просмотров
Пригласить эксперта
Ответы на вопрос 3
ivnik
@ivnik
Я бы попробовал протокол sctp, в 7-й java появилась поддержка в jdk. В отличие от tcp, протокол ориентирован на сообщения (т.е. нет необходимости кодировать как-то кодировать данные в случае tcp), можно задать получение сообщений по мере их поступления (а не по порядку). Есть одно но, размер сообщения ограничен в 64 кб. Зато достаточно открыть только 1 соединение. Посмотрите в wiki: ru.wikipedia.org/wiki/SCTP

Если использовать классический tcp и требования к latency жесткие, то скорее всего сделал бы пул каналов.

P.S. JMX не рассматриваете из-за требований к производительности?
Ответ написан
@relgames
Java Developer
Если JMS никак, то лучше всего открывать по одному каналу на каждую связь сервис-сервис
Открывать каналы с каждым сообщением сильно накладно, а держать один канал на все сервисы тоже не очень хорошо — допустим, сервис1 послал 100 пакетов, а сервис 2 послал 1 пакет, тогда пока из канала не прочитают 100 пакетов от первого, 1 пакет от второго получен не будет.
Ответ написан
@synapse_people
hessian не пойдет?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы