Варианты использования для реактивных потоков с использованием java 9 Потоки в сервлетах?

Я ищу прецеденты для использования реактивных потоков в контейнере сервлетов (или просто HTTP-сервере).

В проекте Jetty началось задание: "Реактив Jetty?" и мы заметили предложение для добавления реактивных потоков в java 9.

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

Таким образом, у кого-нибудь есть хорошие примеры использования, которые они могли бы разделить/объяснить, чтобы мы могли направить наши эксперименты на причалах для удовлетворения их потребностей. Мне кажется, что у меня есть издатель базы данных на базе RS, который отправляет объекты по пути ответа HTTP или соединения с веб-сервером, используя Flow.Processors для конверсий на этом пути.

Ответ 1

Жизнеспособный вариант использования - это использование POST для многочастных форм данных, особенно при загрузке файлов.

Проект Typesafe ConductR (отказ от ответственности: я для него ведущий), получает многочастные данные формы, когда пользователь загружает расслоение. Мы используем akka-streams/http.

Мы считываем первые две части потока, так как в нашем протоколе указано, что они должны объявить некоторые метаданные, чтобы мы знали, с какими node писать пучки. После некоторой проверки мы затем определяем node, чтобы записать их и подключить частично потребленный поток. Таким образом, node, который получает запрос на загрузку пакета, согласовывает, к какому node он собирается его записать, но не должен потреблять весь поток (который может быть 200 МБ), а затем записать его снова.

Учет многочастных данных формы также является отличным случаем использования, поскольку вы можете передавать файл с диска в качестве источника и передавать его на какую-то конечную точку http, то есть клиентскую часть того, что я описывал выше.

Преимущества обоих вариантов использования - это то, что вы минимизируете объем памяти, необходимый для перемещения байтов по сети, и вы выполняете только файл IO, где это необходимо.