RxScala Observables vs Play Framework Enumerators

时间:2015-06-30 15:49:22

标签: scala asynchronous playframework playframework-2.0 rx-scala

如何使用Play Frameworks Enumerators,Iteratees和Enumeratees,与使用RxScalas Observables,Subscriptions等进行比较,以获得异步数据流?

在什么类型的场景中你会选择使用RxScala,何时选择Play?

如果你的流中有大量数据会影响你的决定吗?

2 个答案:

答案 0 :(得分:3)

这取决于你想做什么。如果你想做组合式样解析,Iteratees会发光。它们非常简单 - 它们有一个叫做fold的方法,迭代中的所有其他方法,枚举器和枚举只是调用fold的东西。但对于许多人来说,流式处理的功能性方法对于学习它们来说过于精力投入,因此更为迫切的方法(如RX)可能更适合。由于这个原因,游戏本身正在转移到Akka流。

答案 1 :(得分:2)

这个问题很有意思,因为它比较了两种完全不同的做同样事情的方法。我一直在与EPFL的Martin Odersky一起研究这些图书馆的差异。

请注意,这项工作是在Play转移到Akka流之前完成的,所以当我们现在和将来看时,James Roper的反应是好的。但是,由于你真的在问两者之间的差异,我可以试着在这里给出一个见解。

如果您熟悉面向对象编程(大部分时间都是如此),Rx很容易使用。播放迭代来自纯粹的功能世界(见Haskell Enumerator and Iteratee)并且不那么直观。因此,相同应用程序的编写非常不同。但是,可以完成Iteratees和Observables之间的映射(参见下面的GitHub链接)。但它有其局限性。

我们可以确定的主要问题是Iteratees原生支持背压,Observables不支持。实际上,如果数据流太大,Rx将数据存储在对象中(即在堆栈上)。在这种情况下,这可能会导致内存问题。但是,由于Iteratees纯粹是功能性的,因此折叠操作中的每个数据都将由函数使用。从这个意义上说,如果第一个元素仍然没有被消耗(第二个元素仍然不存在!),则第二个元素不能被赋予Iteratee。这就是我们所说的压力,因为数据生产者已经了解了消费者利率,并且流量问题被传播回数据生产者。

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

了解Akka Streams的背压会很有趣。本地,因为它是一个消息传递库,问题应该与Rx相同。但是,域中似乎有一些有趣的工作,比如使用TCP来解决问题的article

请查看GitHub或全文:Observables for Play!