Есть действительно хорошая презентация Дуга Ли о масштабируемом вводе / выводе в Java, которую я использовал при создании своего сервера. Я использую следующий подход:
У меня есть один поток ввода / вывода в моем "реакторе", который выполняет только ввод / вывод (и очень простое декодирование / кодирование); Он просто выполняет преобразование между байтами и объектами сообщений, а затем передает объекты входящих сообщений в пул потоков для обработки бизнес-логики. Я очень рекомендую этот подход - Если ваш поток ввода-вывода не станет насыщенным, нет необходимости в более чем одном потоке ввода-вывода , и я бы предположил, что большинство узких мест ввода-вывода связано с тем, что происходит другая обработка в этой теме.
Если вы можете доказать, что ваш поток ввода-вывода переполнен, вы можете следовать схеме «нескольких реакторов», предложенной в презентации, согласно которой главный реактор принимает входящие соединения, а затем передает их дочерним реакторам, которые выполняют обработку. Каждый дочерний реактор мультиплексируется между подмножеством общих соединений, и, следовательно, нет опасности того, что более одного потока взаимодействуют с данным SelectionKey
.