Наблюдаемые RxScala и перечислители платформы Play

Чем отличается использование перечислителей, итераций и перечислителей Play Frameworks с использованием RxScalas Observables, подписок и т. Д. Для асинхронных потоков данных?

В каком типе сценариев вы бы выбрали RxScala и когда выбрали бы Play?

Если бы через ваш поток проходили большие объемы данных, повлияло бы это на ваше решение?


person zunior    schedule 30.06.2015    source источник
comment
Не знаком с Play. Я только что просмотрел документы API Play Enumerators, Iteratees и Enumeratees. Похоже, в RxScala гораздо больше API. И в Play нет чего-то вроде подписки для управления ресурсами и отмены. Верно?   -  person zsxwing    schedule 01.07.2015
comment
Итераторы Play работают. Вы не вызываете метод noarg для закрытия. Вы сопоставляете итерацию, чтобы закрыть ресурс, когда это будет сделано. Так что ничего вроде подписки вам не нужно.   -  person James Roper    schedule 01.07.2015


Ответы (2)


Все зависит от того, что вы хотите делать. Итеративы великолепны, если вы хотите выполнить синтаксический анализ в стиле комбинатора. Они действительно просты - у них есть один метод, называемый fold, все остальное в итерациях, перечислителях и перечислителях - это просто вещи, которые вызывают fold. Но для многих этот функциональный подход к потоковой обработке - слишком много умственных вложений, чтобы их изучить, поэтому более императивные подходы, такие как RX, могут быть более подходящими. Именно по этой причине сама игра перемещается в потоки Akka.

person James Roper    schedule 01.07.2015
comment
Значит, Plays Iteratees в любом случае не будет хорошим решением, потому что они скоро станут нерекомендуемыми? - person zunior; 02.07.2015
comment
Библиотека iteratees не исчезнет, ​​она просто не будет использоваться ядром Play. Как я уже сказал, это зависит от вашего варианта использования. - person James Roper; 10.07.2015

Вопрос интересен, потому что в нем сравниваются два совершенно разных способа сделать одно и то же. Я изучал различия этих библиотек в проекте с Мартином Одерски из EPFL.

Обратите внимание, что эта работа была проделана до того, как Play переместится на потоки Akka, поэтому Джеймс Ропер ответил хорошо, когда мы смотрим на настоящее и будущее. Однако, поскольку вы действительно спрашиваете о различиях между ними, я могу попытаться дать некоторое представление здесь.

С Rx легко работать, если вы знакомы с объектно-ориентированным программированием (что в большинстве случаев так и есть). Итерации воспроизведения происходят из чисто функционального мира (см. Haskell Enumerator и Iteratee) и менее интуитивно понятны. Таким образом, написание одного и того же приложения сильно отличается. Однако сопоставление между Iteratees и Observables может быть выполнено (см. Ссылку GitHub ниже). Но у этого есть предел.

Основная проблема, которую мы можем определить, заключается в том, что Iteratees изначально поддерживают обратное давление, а Observables - нет. Действительно, если поток данных слишком велик, Rx будет хранить данные в объекте (то есть в стеке). В этом контексте это может быстро привести к проблемам с памятью. Однако, поскольку Iteratees чисто функциональны, каждая часть данных будет потребляться функцией в операции сворачивания. В этом смысле второй элемент не может быть передан Iteratee, если первый еще не потреблен (функция все еще не существует!). Это то, что мы называем обратным давлением, потому что производитель данных имеет представление о скорости потребителя, и проблема скорости потока передается обратно производителю данных.

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

Было бы интересно узнать об обратном давлении в Akka Streams. Изначально, поскольку это библиотека передачи сообщений, проблема должна быть такой же, как и с Rx. Однако, похоже, есть интересная работа в этой области, например статья, позволяющая обойти проблему с использованием TCP.

Взгляните на GitHub или полный текст здесь: Observables for Play!

person ffarquet    schedule 22.07.2015
comment
Что касается противодавления: оно также поддерживается в RxJava (начиная с 0.20.0) с помощью метода Subscriber.request. См., Например, вики страница. - person Samuel Gruetter; 22.07.2015