Akka Tcp是否支持全双工通信?

时间:2015-05-05 15:10:23

标签: multithreading scala sockets tcp akka

我已经从this will work

修改了Echo服务器
case Received(data) =>
  connection ! Write(data, Ack(currentOffset))
  log.debug("same {}", sender.eq(connection)) // true
  buffer(data)

这意味着传入和传出的消息由同一个actor处理。因此,单个工作线程(从邮箱接收消息)将处理读写操作。

经典"世界我可以创建一个线程来从套接字读取,另一个线程用于写入并获得同步通信。

1 个答案:

答案 0 :(得分:1)

Akka远程处理允许您使用可插入传输实现,因此您可以选择如何实现TCP或任何其他传输协议。默认情况下,您获得enabled-transports = ["akka.remote.netty.tcp"]

TCP是全双工协议。套接字支持全双工。所以没有什么能阻止你在传输层上。

最后验证应用层,即Akka远程处理是否支持全双工。 Akka收到的每条消息都将被转发给目标演员。我们很明显知道消息处理是异步的,所以当一个actor处理一个消息时,只要你的传输协议允许,它就可以发送或接收消息(在这种情况下它就是这样)。

但是,单个actor中的消息处理是同步的:任何给定的actor只能在一个时间点发送或接收消息。这意味着如果您通过connection发送消息,而Akka远程处理也接收发往您的actor的消息,那么这些收到的消息将在actor消息队列中排队。 Akka遥控器可以同时发送和接收,但你的演员将像往常一样经过它的队列:弹出,处理,[发送],冲洗和重复。

回到你的问题:你可以期待Akka通过TCP进行异步发送/接收。使用Akka Remoting时,您不能直接使用套接字。相反,Akka(netty)运行一个通道选择器并异步接收TCP消息并将它们发送到观察者/回调 - Akka内部。这些转换为Akka应用程序消息并发送给您的actor(添加到队列中)。