RxScala Observables 与 Play Framework 枚举器

RxScala Observables vs Play Framework Enumerators

对于异步数据流,使用 Play Frameworks 枚举器、迭代器和枚举器与使用 RxScalas 可观察对象、订阅等相比如何?

你会选择在什么场景下使用RxScala,什么时候会选择Play?

如果您的流中有大数据流,这会影响您的决定吗?

这取决于你想做什么。如果您想进行组合器样式解析,迭代器会大放异彩。它们真的很简单——它们有一个称为 fold 的方法,iteratees、enumerators 和 enumeratees 中的所有其他东西都只是调用 fold 的东西。但对于许多人来说,流处理的函数式方法学习它们需要太多的脑力投入,因此 RX 等命令式方法可能更合适。正是出于这个原因,Play 本身正在转向 Akka 流。

这个问题很有趣,因为它比较了做同一件事的两种完全不同的方式。我一直在与 EPFL 的 Martin Odersky 一起研究这些库的差异。

请注意,这项工作是在 Play 转移到 Akka 流之前完成的,因此当我们展望现在和未来时,James Roper 的回应是好的。不过,既然你真的问的是两者之间的区别,我可以试着在这里给出一个见解。

如果您熟悉面向对象的编程(大多数情况下都是如此),那么 Rx 很容易使用。 Play 迭代器来自纯函数世界(参见 Haskell Enumerator and Iteratee)并且不太直观。同一个应用程序的编写因此非常不同。但是,可以完成 Iteratees 和 Observable 之间的映射(参见下面的 GitHub link)。但也有它的极限。

我们可以识别的主要问题是 Iteratees 本机支持背压,而 Observables 不支持。事实上,如果数据流太大,Rx 会将数据存储在对象中(即堆栈中)。在这种情况下,这可能会很快导致内存问题。但是,由于 Iteratees 是纯函数式的,因此每条数据都将在折叠操作中被函数消耗。从这个意义上讲,如果第一个元素还没有被消费(函数仍然不存在!),则不能将第二个元素提供给 Iteratee。这就是我们所说的背压,因为数据生产者对消费者速率有一个想法,并且流量问题被传播回数据生产者。

总而言之,如果您对这两个库完全满意并且想在两者之间进行选择,您可以考虑应用程序的用途。如果你永远不会有大流量,你可以使用 Rx。在另一种情况下,我建议使用 Iteratees。

了解 Akka Streams 中的背压会很有趣。由于它本身是一个消息传递库,因此问题应该与 Rx 相同。但是,该领域似乎有一些有趣的工作,例如 article 使用 TCP 来规避问题。

看看 GitHub or at the full paper here : Observables for Play!