Akka Tcp 是否支持全双工通信?
Does Akka Tcp support full-duplex communication?
我已经从 https://github.com/akka/akka/blob/master/akka-docs/rst/scala/code/docs/io/EchoServer.scala#L96
修改了 Echo 服务器
case Received(data) =>
connection ! Write(data, Ack(currentOffset))
log.debug("same {}", sender.eq(connection)) // true
buffer(data)
这意味着传入和传出消息由同一个参与者处理。因此,单个工作线程(从邮箱获取消息)将处理读写操作。
在 "classical" 世界中,我可以创建一个线程从套接字读取,另一个线程写入并获得同步通信。
Akka 远程处理允许您使用可插入的传输实现,因此您可以选择 TCP 或任何其他传输协议的实现方式。默认情况下你得到 enabled-transports = ["akka.remote.netty.tcp"]
.
TCP 是一种全双工协议。套接字支持全双工。所以在传输层没有什么能阻止你。
验证应用层的最后一件事,即 Akka 远程处理是否可以支持全双工。 Akka 收到的每条消息都将转发给目标 actor。我们显然知道消息处理是异步的,因此当一个参与者正在处理一条消息时,另一个参与者可以发送或接收消息,只要您的传输协议允许(在本例中是允许的)。
但是,单个 actor 中的消息处理是同步的:任何给定的 actor 只能在一个时间点发送或接收消息。这意味着如果您通过 connection
发送消息,而 Akka 远程处理也在接收发往您的 actor 的消息,那么这些接收到的消息将在 actor 消息队列中排队。 Akka 远程处理将能够同时发送和接收,但您的 actor 将照常通过它的队列:弹出、处理、[发送]、冲洗和重复。
回到你的问题:你可以期待 Akka 为你做异步send/receive over TCP。使用 Akka Remoting 时,您不会直接使用套接字。相反,Akka (netty) 运行一个通道选择器并异步接收 TCP 消息并将它们发送到 observers/callbacks - Akka 内部。这些被转换为 Akka 应用程序消息并发送给您的演员(添加到队列中)。
我已经从 https://github.com/akka/akka/blob/master/akka-docs/rst/scala/code/docs/io/EchoServer.scala#L96
修改了 Echo 服务器case Received(data) =>
connection ! Write(data, Ack(currentOffset))
log.debug("same {}", sender.eq(connection)) // true
buffer(data)
这意味着传入和传出消息由同一个参与者处理。因此,单个工作线程(从邮箱获取消息)将处理读写操作。
在 "classical" 世界中,我可以创建一个线程从套接字读取,另一个线程写入并获得同步通信。
Akka 远程处理允许您使用可插入的传输实现,因此您可以选择 TCP 或任何其他传输协议的实现方式。默认情况下你得到 enabled-transports = ["akka.remote.netty.tcp"]
.
TCP 是一种全双工协议。套接字支持全双工。所以在传输层没有什么能阻止你。
验证应用层的最后一件事,即 Akka 远程处理是否可以支持全双工。 Akka 收到的每条消息都将转发给目标 actor。我们显然知道消息处理是异步的,因此当一个参与者正在处理一条消息时,另一个参与者可以发送或接收消息,只要您的传输协议允许(在本例中是允许的)。
但是,单个 actor 中的消息处理是同步的:任何给定的 actor 只能在一个时间点发送或接收消息。这意味着如果您通过 connection
发送消息,而 Akka 远程处理也在接收发往您的 actor 的消息,那么这些接收到的消息将在 actor 消息队列中排队。 Akka 远程处理将能够同时发送和接收,但您的 actor 将照常通过它的队列:弹出、处理、[发送]、冲洗和重复。
回到你的问题:你可以期待 Akka 为你做异步send/receive over TCP。使用 Akka Remoting 时,您不会直接使用套接字。相反,Akka (netty) 运行一个通道选择器并异步接收 TCP 消息并将它们发送到 observers/callbacks - Akka 内部。这些被转换为 Akka 应用程序消息并发送给您的演员(添加到队列中)。