Как спроектировать сервер с множеством постоянных соединений - PullRequest
2 голосов
/ 28 июня 2009

Я разрабатываю приложение, в котором многие клиенты подключаются к центральному серверу. Этот сервер сохраняет эти соединения, отправляя сообщения об активности каждые полчаса. На сервере есть встроенный HTTP-сервер, который обеспечивает интерфейс для клиентских подключений (например, http://server/isClientConnected?id=id).. Мне было интересно, как лучше это сделать. Моя текущая реализация на Java, и у меня просто есть Карта с идентификаторами в качестве ключа, но для каждого соединения запускается поток, и я не знаю, действительно ли это лучший способ сделать это. Любые указатели приветствуются.
Спасибо,
Исаак Уоллер

Ответы [ 4 ]

6 голосов
/ 28 июня 2009

Используйте пакет java.nio, как описано на этой странице: Создание масштабируемых серверов с Java NIO . Также внимательно прочитайте эту страницу: Архитектура высокопроизводительного масштабируемого сервера на базе NIO .

Лично я не стал бы беспокоиться о внутренних компонентах NIO и использовал бы такую ​​среду, как Apache MINA или xSocket . NIO сложен и легко ошибиться в очень непонятных отношениях. Если вы хотите, чтобы он просто работал, используйте фреймворк.

3 голосов
/ 29 июня 2009

Используя один поток на соединение, вы обычно можете масштабировать до 10 000 соединений на одном компьютере. Для компьютера с Windows 32 вы, вероятно, достигнете предела около 1000 подключений.

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

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

2 голосов
/ 28 июня 2009

Если клиенты будут подключены в течение длительных периодов времени, выделение потока для каждого клиента может быть проблематичным. Каждый поток на сервере требует определенного количества ресурсов (например, памяти для стека).

Вы можете использовать Jetty Continuations для обработки клиентского запроса с меньшим количеством потоков с помощью асинхронных сервлетов.

0 голосов
/ 15 мая 2012

Узнайте больше о паттерне Reactor. Для этого в Java есть реализация (она использует каналы вместо потока для клиента). Это легко реализовать и очень эффективно.

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