Java Поток одного клиента для связи нескольких серверов для проекта IOT - PullRequest
2 голосов
/ 19 февраля 2020

Я хочу создать клиентский поток для TCP IP-связи. Но клиентский поток должен быть в состоянии обмениваться данными как минимум с 10000 серверами одновременно. Поскольку я хочу общаться с миллионами серверов (практически полевых устройств на основе GPRS), не рекомендуется запускать миллионы клиентских потоков и управлять ими. Я пытался с NIO Selector сделать это. Но я обнаружил, что это возможно только для серверного потока. ThreadPoolExecutor также я пробовал. Это также не удалось управлять огромным количеством соединений в то же время. Пожалуйста, дайте хорошее предложение для управления огромным количеством серверов без запуска слишком большого количества потоков.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Если вам нужно выполнить сетевой ввод / вывод с чистым Java, у вас есть три варианта: старый ввод / вывод, новый ввод / вывод (nio) и новый ввод / вывод 2 (nio2). Старый ввод / вывод использует блокирующие вызовы, поэтому в основном вам понадобится один поток на соединение. Вы не хотите этого делать, поэтому вы должны использовать nio или nio2. На самом деле нет никаких ограничений на использование селектора только с сервером, вы можете использовать его для клиентских подключений.

Также обратите внимание, что использование nio или nio2 не самая простая задача в мире. Подумайте об использовании библиотеки netty, которая была создана именно для вашего варианта использования: для написания масштабируемых сетевых приложений. Это не самая простая библиотека для использования, но я все же рекомендую ее, потому что она реализует много вещей для вас. Также есть много реализаций протоколов для netty, так что есть вероятность, что вам даже не нужно будет писать столько кода.

Большинство сетевых примеров действительно о серверах, потому что именно это обычно пишут люди. Но вполне возможно писать неблокирующие сетевые клиенты таким же образом.

0 голосов
/ 19 февраля 2020

Может быть, использовать что-то неблокирующее, например Play framework (использует либо Akka или Netty под капотом), либо Vert.x для обработки этих запросов. Они используют диспетчеризацию работы для ваших пользовательских пулов потоков, чтобы избежать блокировки.

https://www.lightbend.com/blog/why-is-play-framework-so-fast

Поскольку воспроизведение не является блокировкой, потоки не являются блокируется, когда сеть работает медленно, но может свободно обслуживать другой HTTP-запрос - и поскольку Play не поддерживает состояния, нет информации о сеансе, связанной с потоком, который мог бы его запутать.

Это в значительной степени то же самое для Vert.x

Может быть, также посмотрите на Erlang и Go (Go рутина), также посмотрите на UDP . В любом случае аппаратное обеспечение (сеть, ОЗУ, SSD) в конечном итоге станет узким местом. Как и другие здесь и в других ответах указано, Netty - это go для библиотеки, или что-то, использующее ее, может представлять интерес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...