http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0-M2/scala/stream-integrations.html说:
“ActorPublisher和ActorSubscriber不能与远程actor一起使用,因为如果Reactive Streams协议(例如请求)的信号丢失,则流可能会死锁。”
这是否意味着akka流不是位置透明的?如何使用akka流设计一个背压感知的客户端 - 服务器系统,其中客户端和服务器位于不同的机器上?
我一定误解了什么。谢谢你的任何澄清。
答案 0 :(得分:2)
目前,他们严格来说是一个本地设施。 您可以将它连接到TCP接收器/源,它也将使用TCP应用背压(尽管这是Akka Http所做的)。
答案 1 :(得分:2)
如何使用akka流设计一个背压感知的客户端 - 服务器系统,其中客户端和服务器位于不同的机器上?
查看streams in Artery(2016年12月,18个月后):
The new remoting implementation for actor messages was released in Akka 2.4.11 two months ago.
动脉是它的代号。在许多情况下,它是旧远程处理的直接替代品,但实现是全新的,并且它带来了许多重要的改进。
(远程处理使不同主机或JVM上的Actor系统能够相互通信)
关于背压,这不是一个完整的解决方案,但它可以提供帮助:
背压怎么样? Akka Streams完全是关于背压,但是演员的消息传递在没有任何背压的情况下即刻消失。这个设计是如何处理的?
我们无法神奇地为演员消息添加背压。这仍然必须使用消息流控制技术在应用程序级别上处理,例如确认,工作拉动,限制。
当消息发送到远程目标时,它会被添加到第一个阶段(名为
SendQueue
)正在处理的队列中。此队列是有界的,如果它溢出,则将丢弃消息,这与最多一次交付性质的演员消息一致。如果没有应用程序级别的流量控制,则不应发送大量消息。例如,如果消息的序列化很慢并且无法跟上发送速率,则此队列将溢出。Aeron会从接收节点向发送节点传播反压,即如果另一端的
AeronSink
较慢且缓冲区已经过,则出站流中的AeronSource
将不会进展填满。
如果消息的发送速率高于接收节点可以消耗的速率,则SendQueue
将溢出,消息将被丢弃。Aeron
本身有大缓冲区,可以处理消息突发。在网络分区的情况下也会发生同样的事情。当Aeron缓冲区已满时,SendQueue将删除消息。
在入站流中,消息最终被分派到收件人actor。这是一个普通的演员告诉,它将在演员的邮箱中排队。 这是接收侧的背压结束的地方。如果演员比传入的消息速率慢,则邮箱将照常填充。
底线,必须在应用程序级别实现actor消息的流控制。动脉不会改变这一事实。