2017-02-05 35 views
0

Я понимаю, что HTTP2 в Jetty в основном связан с уровнями Connector, Transport и Channel.Каков наилучший способ реализации сервлета HTTP2 в Jetty?

Я пытаюсь решить, какая комбинация будет лучшим для транспортировки двоичных данных между клиентом и сервером:

  1. сервера Jetty http2 с асинхронным сервлетом + Jetty http2 клиентом
  2. сервера
  3. Jetty http2 с синхронизацией сервлета + Jetty http2 клиент
  4. Jetty http2 сервер с асинхронным сервлетом + Нетти http2 клиентом
  5. КПГРЫ клиент и сервер (оба по умолчанию Netty основы)

Деталь:

Я хотел бы передать двоичные данные моего клиенту, и я хотел бы соединение быть неблокирующим/асинхронным. Количество одновременных запросов клиентов может быть высоким, и сервер может занять несколько секунд (несколько раз) для ответа на некоторые запросы.

Каждый ответ представляет собой небольшой фрагмент двоичных данных. Мне бы понравилось, если бы я мог отправить Netty ByteBufs непосредственно в качестве ответа вместо копирования на byte[] или ByteBuffer, но это напрямую не связано с этим вопросом.

Метод № 4 не мой любимый из-за ProtoBuf wrapping (link)limitation (link).

ссылки Jetty:

ответ

3

Отказ от ответственности, я Jetty HTTP/2 сопровождающим.

Учитывая, что у вас есть большое количество клиентов, и эта обработка может занять несколько секунд, я бы рекомендовал перейти с параметром 1 - асинхронный сервлет и клиент Jetty HTTP/2.

С «асинхронным сервлетом» у вас есть 2 варианта: 1) асинхронная обработка с блокировкой ввода-вывода или 2) асинхронная обработка + асинхронный ввод-вывод.

Обработка асинхронных сервлетов запускается с использованием HttpServletRequest.startAsync().

сервлет асинхронного ввода/вывода инициируется с помощью ReadListener и WriteListener соответственно с ServletInputStream и ServletOutputStream.

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

Следует или не следует использовать асинхронный ввод-вывод, поскольку у вас небольшие бинарные ответы. Блокировка ввода-вывода намного проще для кода и отладки, тогда как асинхронный ввод-вывод определенно сложнее кодировать и отлаживать. Async I/O действительно сияет, когда у вас есть большое содержимое и медленные клиенты, которые могут перегружать TCP-соединение.

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

Что касается вопроса о копировании данных, если вы готовы повергнуть к классам Jetty, вы можете избежать копии непосредственно писать ByteBuffer к ServletOutputStream подкласса см this example.

Наконец, с клиентом Jetty вы можете использовать высокоуровневый HttpClient с транспортом HTTP/2, как подробно here. Преимуществом будет API высокого уровня, который имеет дело только с понятиями HTTP, вместо использования низкоуровневого HTTP2Client, который имеет дело с HTTP/2 кадрами, потоками и т. Д.

Откажитесь от того, что вы в конечном итоге выберете, и как оно идет для вас!