В каких случаях выбрать Jetty, а в каких Netty?

«В каких случаях выбрать Jetty, а в каких Netty?» — вопрос из категории Сети, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор между Jetty и Netty определяется уровнем абстракции и типом решаемой задачи.

Критерий Jetty Netty
Уровень Высокоуровневый сервер приложений (Servlet-контейнер). Низкоуровневый сетевой фреймворк для асинхронного ввода-вывода (NIO).
Основное назначение Запуск веб-приложений (REST API, MVC) с поддержкой стандартов (Servlet, WebSocket). Построение высокопроизводительных сетевых серверов и клиентов для кастомных протоколов.
Типичный use-case Embedded-сервер в Spring Boot, традиционные веб-приложения. Чат-серверы, прокси-серверы, кастомные бинарные протоколы (например, для игр), клиенты/серверы для RPC (gRPC).
Ключевая абстракция Servlet, Filter, HttpServletRequest/Response. Channel, EventLoop, ChannelHandler, ByteBuf.

Когда использовать Jetty:

  • Вам нужен легкий, встраиваемый сервер для Spring Boot приложения.
  • Приложение построено на Servlet API, JSP или требует поддержки HTTP/2, WebSocket по стандарту.
  • Приоритет — простота настройки и быстрый старт.

Когда использовать Netty:

  • Требуется максимальная производительность и низкие задержки для сетевых операций.
  • Необходимо реализовать нестандартный сетевой протокол поверх TCP/UDP.
  • Вы строите высоконагруженный middleware (шлюз, балансировщик, прокси).

Пример конфигурации Jetty в Spring Boot (application.yml):

server:
  port: 8080
  # Spring Boot использует Tomcat по умолчанию.
  # Для Jetty нужно исключить tomcat и добавить jetty-starter.

Итог: Jetty — для веб-приложений, Netty — для сетевых сервисов. Многие высокоуровневые фреймворки (например, gRPC, Spring WebFlux) используют Netty "под капотом".