Какая польза от использования netty4 NIO на стороне клиента по сравнению с блокировкой ввода-вывода по одному потоку на соединение?

Со стороны сервера я вижу, что преимущество NIO - это возможность управлять несколькими сетевыми соединениями с меньшим количеством потоков по сравнению с одним потоком на соединение, блокирующим ввод-вывод.

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

Итак, мои вопросы:

1) каковы преимущества использования netty / NIO на стороне клиента? 2) можно ли управлять несколькими подключениями с меньшим количеством потоков на стороне клиента?

Спасибо!

Я загрузил образцы кода в github: https://github.com/hippoz/ogop-lseb

Пример класса сервера / клиента - moc.ogop.ahsp.demo.nio.MultipleConnectionNioMain и moc.ogop.ahsp.demo.nio.NettyNioServerMain.


person James Zheng    schedule 19.07.2016    source источник
comment
Нет, если вы не планируете иметь большое количество исходящих подключений, что необычно.   -  person user207421    schedule 19.07.2016
comment
да, на самом деле мы используем постоянное соединение между каждым клиентом / сервером. поэтому каждый клиент может одновременно подключаться примерно к 1000 серверам.   -  person James Zheng    schedule 19.07.2016
comment
Что ж, в этом случае (что не является следствием «постоянного соединения») вы можете сохранить потоки за счет значительно более сложного кодирования. Я бы сначала заставил его работать с java.net, а потом посмотрел, есть ли у вас проблемы с масштабируемостью.   -  person user207421    schedule 20.07.2016
comment
Даже у меня в голове такой же вопрос, но я еще не получил ответа? пожалуйста, поделитесь, если вы получили свой ответ   -  person Sachin Sachdeva    schedule 18.03.2017


Ответы (1)


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

Преимущество NIO в любом месте - производительность. Это практически единственная причина, по которой мы его используем. Использование блокировки ввода-вывода НАМНОГО проще. Используя рабочую модель и NIO, вы можете ограничить количество потоков (и возможное вычислительное время), которое использует процесс. Так что, если у вас есть два воркера, и они сходят с ума, используя 100% времени процессора, вся система не перейдет в обход, потому что у вас есть еще 2-4 ядра.

Повеселись!

person Johnny V    schedule 06.08.2016