akka stream ActorSubscriber不适用于远程actor

时间:2015-07-13 15:29:45

标签: stream akka

http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0-M2/scala/stream-integrations.html说:

“ActorPublisher和ActorSubscriber不能与远程actor一起使用,因为如果Reactive Streams协议(例如请求)的信号丢失,则流可能会死锁。”

这是否意味着akka流不是位置透明的?如何使用akka流设计一个背压感知的客户端 - 服务器系统,其中客户端和服务器位于不同的机器上?

我一定误解了什么。谢谢你的任何澄清。

2 个答案:

答案 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消息的流控制。动脉不会改变这一事实