Как спроектировать сервер с большим количеством постоянных подключений

StackOverflow https://stackoverflow.com/questions/1055485

Вопрос

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

Это было полезно?

Решение

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

Лично я бы не стал заморачиваться с внутренними компонентами NIO и использовать фреймворк типа Апач МИНА или xSocket ( xSocket - сокет ).NIO сложен, и его легко ошибиться очень неясными способами.Если вы хотите, чтобы это "просто работало", то используйте фреймворк.

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top