919

Coroutines или RxJava — какой фреймворк выбрать для своего проекта?

Еще недавно Coroutines имели довольно бедную функциональность, но теперь, с добавлением StateFlow и SharedFlow, они вполне могут составить конкуренцию RxJava, поэтому выбор технологии стал не таким очевидным.

Мы взвесили все «за и против» для обоих фреймворков и надеемся, что это поможет вам выбрать правильное решение для своего проекта.

Плюсы RxJava

➡️ Стабильность

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

➡️ Проверенная технология

RxJava — это зрелый и проверенный временем фреймворк, который успешно применяется в множестве проектов. Опытные разработчики знают весь его функционал и все вероятные узкие места.

Что касается корутин, то эта технология довольно новая, из-за чего нет полной уверенности в том, как она себя проявит в тех или иных случаях. Плюс, если проект уже работает на RxJava, разработчикам придется дополнительно переучиваться, искать новые подходы и адаптировать имеющийся функционал под Coroutines.

➡️ Совместимость с Java

Использовать RxJava можно с любым языком программирования, совместимым с Java, а вот писать корутины можно только при  помощи Kotlin. Для некоторых проектов это не принципиально, но для других — может стать настоящей головной болью.

➡️ Поиск багов

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

Плюсы Coroutines

➡️ Простой API

Для каждого отдельного случая RxJava может использовать множество типов потоков — Observable, Flowable, Maybe, Single, Completable. В Kotlin весь этот функционал дублируется только двумя типами: suspend fun и Flow, при этом асинхронные выражения в нем могут вызываться с помощью простых лямбда-выражений, что значительно упрощает разработку. То есть, у программистов практически пропадает необходимость создавать одинаковый код для каждого типа пять раз, по количеству видов потоков.

➡️ Kotlin Multiplatform

Как понятно из названия, RxJava поддерживает только язык Java, в то время как Coroutines способны работать на любой платформе, поддерживающей Kotlin. Следовательно, если возникнет необходимость, например, переиспользовать асинхронный код между Android и iOS, то с помощью корутин это можно сделать без проблем. 


➡️ Структурированная многопоточность

В отличие от склонных к утечкам потоков Rx, Coroutines обрабатывают входящие объекты даже если сам программист про них забыл. Структурированность корутинов Kotlin значительно упрощает управление жизненным циклом открытых потоков.

➡️ Простые операторы

Создание кастомных операторов в Rx может стать настоящим испытанием для разработчика, поскольку требует глубокого понимания того, как фреймворк работает «под капотом». Во Flow они пишутся как весь остальной код, благодаря чему вместо сотни строк кода, зачастую, можно обойтись всего парой строчек.

➡️ Производительность

Судя по результатам тестирования с помощью Reactive Scrabble — стандарта для проверки эффективности потоков, производительность Flow корутин значительно превосходит RxJava.

➡️ Простое управление back-pressure

Когда данные выдаются быстрее, чем принимающий поток успевает их обрабатывать возникает back-pressure — переизбыток входящих событий. Для Rx это большая проблема и причина появления избыточного и запутанного кода во фреймворке, поскольку для избежания переизбытка испускающие потоки должны постоянно взаимодействовать с принимающими. 

Flow корутин справляется с этим куда проще. Если в какой то момент входящих данных становится слишком много, он просто откладывает на время испускающие события потоки. В результате программисту не нужно так часто заниматься back-pressure, что экономит драгоценное время.

➡️ Взаимозаменяемость

Корутины и Rx обладают хорошей взаимозаменяемостью. Благодаря преобразователям, поставляемых Kotlin, программисты могут переводить проект из Rx во Flow поэтапно и даже продолжить использование Rx-библиотек в своем проекте, при этом код не придется переписывать вручную. Кроме того, у Coroutines есть инструменты, позволяющие автоматически переводить устаревшие потоки Rx на Flow.

Наше мнение

Coroutines во многом превосходят RxJava с технической точки, и главной проблемой технологии остается ее необкатанность, со всеми вытекающими последствиями. Вам придется адаптироваться, искать подходы, находить решения, что-то переписывать под себя и много заниматься дебагом — по крайне мере до тех пор, пока не изучите как технология себя ведет в специфических ситуациях. 

Однако это временные трудности, и если их преодолеть, вам станут доступны все преимущества корутин: мультиплатформенность, простой API, структурированная многопоточность и многое другое. Поэтому фактически здесь выбор между проверенной стабильностью и технологичностью.

Если вы хотите освоить разработку на Java и Kotlin — приходите на курсы SpaceLAB. Здесь вас ждет полностью бесплатное обучение под кураторством опытных менторов с реальной возможностью трудоустройства.