Каков основной вариант использования для асинхронного ввода-вывода - PullRequest
4 голосов
/ 22 сентября 2011

Мое приложение не имеет веб-интерфейса, просто необходимо использовать сокеты для обслуживания около 1000 клиентов.Пропускная способность и задержка имеют огромное значение для меня.В настоящее время используется select() из NIO, но вы собираетесь перейти к асинхронному вводу-выводу в NIO.2.

  1. Когда следует использовать асинхронный ввод-вывод?
  2. Каков основной вариант использования асинхронного ввода-вывода?

Ответы [ 2 ]

3 голосов
/ 22 сентября 2011

Асинхронный ввод-вывод очень хорош в ситуациях, когда вам нужно масштабировать для обработки множества одновременных соединений. Исторически одним из способов было выделение потока для каждого соединения, но этот подход имеет ограничения , о которых вы можете прочитать здесь . С асинхронным вводом-выводом вы можете легко обрабатывать многие вещи с меньшим количеством потоков и, следовательно, лучше масштабировать.

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

В любом случае все зависит от того, что вы хотите решить, и какими должны быть ваши ожидания (цифры). Асинхронный ввод-вывод велик и во многих случаях и так синхронен. Также могут быть другие вещи, которые вы можете рассмотреть, такие как протокол. Несколько клиентов, заинтересованных в одних и тех же данных (потоковая передача), могут указать, что вы хотите посмотреть многоадресную рассылку. Если трафик выделен для каждого клиента, то это может не подходить.

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

3 голосов
/ 22 сентября 2011

Если вы используете сети Infiniband, я бы посоветовал взглянуть на асинхронный ввод-вывод.

Сравнение Java 7 Async NIO с NIO.

Однако, если вы используете обычныйEthernet, скорее всего, будет медленнее, чем быстрее.Кодирование является более сложным, чем использование неблокирующего ввода-вывода, что более сложно, чем использование блокирующего ввода-вывода.

Если задержка имеет первостепенное значение, я предлагаю вам взглянуть на использование обходных сетевых адаптеров ядра, таких как Solarflare.Однако, если для вас приемлема задержка в 100 микросекунд, маловероятно, что вам это нужно.

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