Программирование на сокете, Java, Tomcat 6, Масштабирование - PullRequest
1 голос
/ 31 июля 2010

Я довольно новичок в веб-программировании и в настоящее время занимаюсь разработкой веб-интерфейса для мобильного приложения. В настоящее время у меня есть пользователи, которые входят в систему с использованием взаимодействий сервлетов, и, как только они получат полный доступ к приложению, мне нужно открыть Socket Connection, чтобы я мог предоставлять запросы сервера. Теперь проблема, с которой я сталкиваюсь, заключается в том, как люди обрабатывают тысячи одновременных соединений сокетов. Я сталкивался с людьми, которые говорили о ThreadPools, который довольно прост в реализации и NIO. Есть ли какая-то структура, с которой я могу работать, чтобы мои серверы обрабатывали как минимум 20-30k одновременных соединений. Я также мог бы забыть TCP-соединения и пойти на длинный опрос, но из моего понимания TCP - лучший вариант с точки зрения ресурсов.

@ Стив - я смотрю на первое: один серверный сокет с тысячами соединений.

1 Ответ

2 голосов
/ 01 августа 2010

Я бы сразу посмотрел на кластеризацию сети и использовал ее в качестве основного механизма масштабирования. 30 тыс. Соединений - это довольно много, и у вас мало места для роста, прежде чем вы достигнете какого-либо ограничения на сервер. Если бы сам ввод / вывод не был обременительным, я бы просто использовал множество потоков и серверов с большим количеством лошадиных сил и памяти. Сделайте так, чтобы вы могли отправлять и иметь запасной план для переключения на мультиплексный NIO, если производительность или масштабирование становятся проблемой, но имейте в виду, что это радикальный пересмотр и примерно в десять раз сложнее программировать, чем java.net. После нескольких лет размышлений я все больше и больше задумываюсь, стоит ли NIO экономить на потоках: оно того стоит: оно добавляет несколько новых проблем, таких как необходимость в принудительном разборе; проблемы синхронизации с селектором, если есть рабочие потоки, которым необходимо изменить состояние регистрации каналов; множество способов ошибиться в коде; и тот факт, что накладные расходы по планированию перемещаются из ОС в ваше приложение, где у вас есть только линейные структуры данных итератора множества, чтобы справиться с этим, если вы не задействуете еще один уровень сложности. Стоит помнить, что select () был изобретен для Unix, чтобы позволить экономить на дорогостоящих процессах. Потоки довольно дешевы и предоставляют очень простую модель программирования со встроенным контекстом для обработки одного соединения. NIO с трудом справляется с этим, за исключением дисциплинированного использования вложенных клавиш выбора, а тем более естественным образом.

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