【问题标题】:Does Akka Tcp support full-duplex communication?Akka Tcp 是否支持全双工通信?
【发布时间】:2015-07-15 09:55:18
【问题描述】:

我已经从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)

这意味着传入和传出消息由同一个参与者处理。因此,单个工作线程(从邮箱中获取消息)将处理读写操作。

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

【问题讨论】:

  • sockets 是双向的,但是你不能使用不同的线程同时读写。它们不是线程安全的。但是他们支持全双工吗?是的。
  • msdn.microsoft.com/en-us/library/… 套接字是线程安全的。 Java socket 有获取 InputStream 和 OutputStream 的方法,通过不同的线程使用它们是安全的。
  • socket和socket类是有区别的!套接字不是线程安全的。

标签: multithreading scala sockets tcp akka


【解决方案1】:

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

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

最后验证应用层,即 Akka 远程处理是否支持全双工。 Akka 收到的每条消息都将转发给目标 Actor。我们显然知道消息处理是异步的,因此当一个参与者正在处理一条消息时,只要您的传输协议允许(在本例中就是这样),另一个参与者就可以发送或接收消息。

但是,单个 Actor 中的消息处理是同步的:任何给定的 Actor 只能在一个时间点发送或接收消息。这意味着,如果您通过connection 发送消息,而 Akka 远程处理也接收发往您的 Actor 的消息,则这些接收到的消息将在 Actor 消息队列中排队。 Akka 远程处理将能够同时发送和接收,但您的 Actor 将正常通过它的队列:弹出、处理、[发送]、冲洗和重复。

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

【讨论】:

  • 提到的示例使用了不依赖 netty doc.akka.io/docs/akka/2.3.10/scala/io.html 的 akka.io 包。也许我应该改写我的问题。与传统的读写线程方法相比,处理读写消息的单个参与者(我已经检查过它是示例)导致潜在的瓶颈。
  • 我认为最好问一个新问题。 Akka IO 是一个完全不同的问题。请将这个问题的标题改回原来的样子,这样我的回答仍然有意义,然后再问一个新问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2015-04-14
  • 2014-05-10
  • 2014-09-01
相关资源
最近更新 更多