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