32
|
Jatin · 技术社区 · 7 年前 |
![]() |
1
79
我看到Oleh Dokuka Project Reactor (此处缺少免责声明), posted an answer 不管它对 Akka Streams 和 Reactive Streams 不正确,请允许我在下面澄清。 免责声明:我从早期就参与了反应流,并且 authored 其大部分 Technology Compatibility Kit . 我还维护Akka和Akka溪流。
还要注意:反应流已经包含在Java 9中,并且称为
java.util.concurrent.Flow.*
所以下面所有关于RS的评论都是一样的
答案是反应流是一种服务提供商接口(SPI)规范反应流,特别是发布者/订阅者/订阅/处理器类型,是 Service Provider Interface . 即使在 earliest discussions 关于2014年的规范。 在规范的早期,甚至规范的类型都试图隐藏Publisher、Subscriber和其他类型。遗憾的是,无论在当时考虑的API中,类型都会泄漏, thus the API(!) was removed and the SPI types are all that remained . 现在,您可以看到一些反应流的实现声称,出于某种原因,它们对这些类型的直接扩展是一种好处。这是不正确的,事实并非如此,也不是反应流接口的目标。这是对这些类型的误解——严格来说,是反应流库同意理解和“说出”(协议)的操作间接口。 作为参考,RxJava 2.0和Reactor确实直接扩展了这些类型,而Akka Streams通过将其隐藏为应用程序开发人员编程接口,保持了RS的设计和原则,这就是Sink不扩展Subscriber的原因。这与“本土支持”无关。我看到人们声称直接的IS-A关系是(相反,声称inter-op库是你的“本土”是对这个概念的误解)。 接收器和订阅者、源和发布者
没错,它们在目的和设计上都很相似。 因为水槽是 lifted representation 有效地产生订阅者的东西。为了简化,您可以将其视为“订阅者工厂”(更具体地说,接收器是“蓝图”,物化器获取接收器的蓝图并创建适当的RS阶段,包括源的发布者和接收器的订阅者。 所以当你说下沉的时候。忽略它实际上是一个工厂,它最终将创建一个订阅者,该订阅者根据反应流执行所有请求和忽略操作。在接收器上声明的所有其他方法也是如此。
这同样适用于
A、 K.A.为什么反应流中没有汇?如上所述,Akka的接收器并不直接扩展订户。然而,这基本上是他们的工厂。 您可能会问:“在正常使用期间,用户是否从未见过这些发布者/订阅者类型?”答案是:是的,这是一个特性,也是一个设计目标(根据反应流是什么)。如果底层发布者和订阅者实例一直直接暴露给用户,则可能会错误地调用它们,从而导致错误和混淆。如果除非明确要求,否则从不公开这些类型,那么发生意外错误的机会就会减少! 一些人误解了这种设计,并声称在Akka Streams中没有“本地”支持它(这是不正确的)。让我们看看在API中从订阅者中分离出来的好处:
事实上,汇不是反应流的一部分,这是绝对正确的。 避免“接收器是订户”的好处
事实上,是的 对用户有益的是,Sink没有为订阅者提供任何明确的IS-A (原文如此!)与其他库一样:
这是因为
由于反应流是一个SPI(服务提供者接口),它旨在让库共享,以便它们可以“使用相同的类型和协议”。Akka Streams和其他反应流库所做的所有通信都遵循这些规则,如果您想将其他库连接到Akka Streams,您只需这样做——为Akka Streams提供inter-op类型,即订阅者、处理器或发布者;不是接收器,因为这是Akka的“特定于Akka的”DSL(特定于域的语言),它在上面增加了方便和其他细节,隐藏(故意!)订阅服务器类型。 Akka(老实说,其他RS实现也被鼓励这样做,但选择不这样做)隐藏这些类型的另一个原因是,它们很容易出错。 如果你发了一个订阅者,任何人都可以在上面打电话,甚至 un-knowingly break rules and guarantees that the Reactive Streams Specification requires 来自与该类型交互的任何人。 为了避免发生错误,Akka流中的反应流类型是“隐藏”的,只有在明确要求时才会暴露出来,即“在不遵循协议的情况下意外调用“原始”反应流类型上的方法,以最大限度地降低人们犯错误的风险”。 |
|
Teyu11 · Akka HTTP多文件上传到S3 7 年前 |
![]() |
stan · Scala RestartSink未来 7 年前 |
![]() |
vgkowski · Akka流从外部世界获取无限流的当前值 7 年前 |