Преимущества Netty перед базовым сервером ServerSocket? - PullRequest
27 голосов
/ 07 декабря 2011

Мне нужно создать относительно простой Java tcp / ip сервер, и у меня возникли небольшие проблемы с определением, использовать ли мне что-то вроде Netty или просто придерживаться простого ServerSocket и InputStream / OutputStream.просто нужно прослушать запрос, а затем передать новый клиентский сокет некоторому коду обработки в новом потоке.Этот поток завершится после завершения обработки и отправки ответа.

Мне нравится идея конвейеров, декодеров и т. Д. В Netty, но для такого простого сценария не стоит тратить время на предварительную разработку.Это кажется немного излишним для наших начальных требований, но я немного нервничаю, что есть много вещей, которые я не рассматриваю.Каковы преимущества Netty для таких простых требований?Что я не могу рассмотреть?

Ответы [ 3 ]

55 голосов
/ 07 декабря 2011

Основным преимуществом Netty по сравнению с простым чтением и записью в сокеты с использованием потоков является то, что Netty поддерживает неблокирующий, асинхронный ввод / вывод (с использованием Java NIO API);когда вы используете потоки для чтения и записи из сокетов (и запускаете новый поток для каждого подключенного соединения, принятого с ServerSocket), вы используете блокирующий синхронный ввод / вывод.

Подход Netty масштабируется гораздо лучше,что важно, если ваша система должна обрабатывать много (тысячи) соединений одновременно.Если вашей системе не нужно масштабировать до нескольких одновременных подключений, возможно, не стоит использовать такую ​​среду, как Netty.

Еще немного справочной информации: потоки - это относительно дорогие ресурсы в операционной системе.Каждому потоку нужна память для стека (размер которого может составлять, например, 2 МБ).Когда вы создаете тысячи потоков, это будет стоить много памяти;Кроме того, операционные системы имеют ограничения на количество потоков, которые могут быть созданы.Таким образом, вы не хотите начинать новый поток для каждого принятого соединения.Идея асинхронного ввода / вывода состоит в том, чтобы отделить потоки от соединений (без отношения один к одному).Соединений может быть намного больше, чем потоков, и всякий раз, когда какое-либо событие происходит на одном из соединений (например, данные получены), поток из пула потоков временно используется для обработки события.

11 голосов
/ 07 декабря 2011

Я думаю, что преимущества использования netty не являются немедленными, но на самом деле приходят позже , когда требования изменяются и обслуживание становится более сложным для вашего проекта. Netty обладает встроенным пониманием протокола HTTP, поэтому вы можете предоставлять простых веб-сервисов RESTful . Также у вас есть возможность использовать асинхронную обработку запросов , которую netty предоставляет в качестве основы, чтобы вы могли потенциально повысить производительность и обслуживать на несколько порядков больше параллельных запросов.

6 голосов
/ 07 декабря 2011

Во-первых, напишите логику вашего сервиса, чтобы он не зависел от вашего уровня общения.

Как сказал Виктор Сорокин, есть преимущество в обучении, если вы делаете это самостоятельно.Так что стоит написать его с помощью сокетов.Это потребует меньше усилий, чтобы начать, и если это работает достаточно хорошо, то вы отправляетесь в гонки.

Если вы обнаружите, что позже вам потребуется больше масштабируемости / устойчивости, вы можете перейти на netty.Просто напишите новый слой нетто, который связывается с вашим уровнем логики сервиса, и поменяйте их местами.

...