Ответ 1
Я работаю над RxJava, и я недавно сделал несколько оценок в Akka-Streams и Reactor.
Насколько я могу судить по всем библиотекам, они сходятся к одному понятию Reactive-Streams, чтобы вы могли идти туда и обратно между реализациями.
Я считаю, что RxJava является самым общим из всех, имеет нулевые зависимости от других библиотек и не уступает concurrency. Он очень популярен на Android в основном благодаря поддержке других библиотек/фреймворков, таких как Retrofit. В ветке 1.x не реализованы Reactive-Streams, но для нее есть обертки, тогда как 2.x является естественным Reactive-Streams (в настоящее время доступен в предварительном просмотре). На многих популярных языках программирования на основе JVM есть адаптеры для него (Scala, Kotlin, Clojure и т.д.).
Реактор соответствует требованиям Reactive-Streams, поскольку это более поздняя библиотека. У них есть зависимости/поддержка многих других библиотек. Они выбрали другой набор компромиссов, когда дело доходит до concurrency и очереди в потоках (т.е. LMAX Disruptor-style). Между ним и RxJava было несколько предложений относительно операторов, и мы начали говорить о наличии общего пула операторов.
Akka сильно доминирует в концепциях Scala; У меня была небольшая проблема с тем, чтобы он работал. Команда, стоявшая за ней, участвовала в разработке спецификации Reactive-Streams, и есть библиотека Akka-Streams, которая рекламируется для поддержки Reactive-Streams, однако доступ к ней является громоздким, потому что его свободный API сильно переплетается с актерской моделью Akka.
Если вы находитесь на стороне сервера/рабочего стола /Android, RxJava, как правило, является хорошим выбором (и я считаю, что он документально лучше других) и нацелен на высокопроизводительные асинхронные операции. Если вы больше на стороне латентности, Reactor может быть лучшим выбором. Я мало знаю об использовании Akka-Streams, но год назад я видел один тест, где веб-сервер, построенный вокруг Akka, превзошел Tomcat и Netty + RxJava.