Как спроектировать сервер с множеством постоянных соединений

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

4 ответа

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам