Сейчас происходит много шума вокруг Project Reactor и реактивным программированием на бэкенде. Однако, на мой взгляд, решение многих повседневных задач остается не раскрытым. В связи с этим мне хотелось бы поделиться некоторыми находками, которые помогут лучше понять как использовать этот подход на бэкенде, написанном на Java.

В микросервисной архитектуре мы применяем, например, id трассировки для отслеживания пути запроса между сервисами. В Java для хранения таких id часто используют MDC, который предоставляет thread local хранилище. Реактивное программирование предполагает асинхронную обработку, а это значит, что поток будет разделен между несколькими запросами одновременно. Следовательно, использовать MDC как есть для хранения id трассировки в пределах потока становится небезопасным. В Project Reactor для решения этой проблемы придумали абстракцию Context, которая работает в паре с конкретным Publisher и позволяет поддерживать актуальное состояние MDC в дискретные моменты времени в пределах одного потока. Подробнее о работе с Context можно прочитать в этой статье.

Чтобы получить преимущество от реактивного подхода предполагается, что весь код должен быть НЕ блокирующим. На данном этапе этого сложно добиться, так как на бэкенде много взаимодействия с RDBMS или проприетарными MQ, драйвера которых используют блокирующие вызовы. Хотя для RDBMS стартовала разработка реактивного R2DBMC драйвера, она еще не дошла до релиза. Как решение проблемы можно вынести все блокирующие вызовы в отдельный пул потоков. В Project Reactor этого поведения можно добиться используя комбинацию subscribeOn и publishOn. На практике это не слишком эффективно, так как пул с блокирующими вызовами становится бутылочным горлошком. Подробнее об этом можно узнать в докладе.

Сложно представить работу бэкенда без транзакций. К сожалению, их поддержка в реактивных драйверах появилась совсем недавно, а spring boot добавил свои абстракции для работы с ними только в версии 2.2.0.M3. Подробнее в об этом можно узнать в видео.

Данная заметка описывает проблемы, с которыми пришлось столкнуться мне и не претендует на полноту. Использовать или нет библиотеки, построенные на базе Project Reactor, прямо сейчас, вы должны решить сами, но перед этим необходимо оценить, насколько они покрывают ваши продуктовые сценарии.