Это самый классический вариант использования реактивных библиотек, какой только можно найти! :)
Ключевой частью «реактивных» архитектур является то, что они могут реагировать на события, а не ждать результатов. RxJava упрощает это с помощью Observable
, а Reactor делает это с помощью нескольких различных механизмов. В Reactor вы можете использовать простой Reactor
и установить replyTo
на Event
, вы можете использовать Stream
или Promise
для составления цепочки обработки значений, очень похожей на Observable
в RxJava, вы можете использовать Processor
для высокоскоростной обработки RingBuffer. , или вы можете использовать ForkJoinPool
для выполнения простой обработки в стиле fork/join. Конечно, вариантов много, но каждый из них предназначен для работы в конкретном случае без ущерба для других вариантов использования. Рамка Reactor — это не один разводной ключ. Это набор ключей, размер которых точно соответствует вашим потребностям.
В этом конкретном случае важной частью является параллелизм, достигаемый за счет выполнения большого количества работы одновременно, поскольку ваш источник данных IO предположительно блокирует поток. RxJava имеет подключаемую модель выполнения, но она довольно грубая. Одной из сильных сторон Reactor является эффективная, детализированная поддержка диспетчеризации задач и легкость, с которой вы можете реагировать на результаты.
Поскольку ваш вариант использования довольно прост и намного ближе к стандартной ситуации ThreadPoolExecutor
, у меня может возникнуть соблазн использовать ForkJoinPool
в Reactor 1.1 (совершенно новый). ForkJoinPool
предоставляет вам единый Promise<ImmutableList<T>>
, который объединяет результаты всех задач, которые вы отправляете в пул, поддерживаемый стандартным ThreadPoolExecutor
. По сути, это «реактивная» оболочка для стандартного пула потоков, поэтому требует очень мало накладных расходов, но обеспечивает гибкость реагирования на выполнение всех отправленных задач. Это похоже на Observable.merge()
RxJava.
person
Jon Brisbin
schedule
28.05.2014
reactive
, но я хочу добавить немного шума. В EIP он вызываетsplit-aggregate
, а Spring Integration предоставляет это готовое решение. В этом случае сплиттер может отправлять элементы вThreadPoolExecutor
или, если хотите, в Reactor или просто в RingBuffer. Каждыйdata source service
должен отправить свой результатaggregator
, а последний просто отправляет объединенный ответ. - person Artem Bilan   schedule 28.05.2014