如果尝试写入不再存在的客户端,远程角色框架会做什么?

oxb*_*kes 10 scala remote-actors actor

我有一个服务器,它使用远程actor框架与多个客户端进行通信.正如这个问题所提到的,我无法跟踪客户何时消失.因此,我的服务器仍在尝试向不存在的客户端发送消息.

  • 这是一个问题吗?(我没有看到任何异常被抛出 - 但我认为如果我的服务器是长寿的话会有内存问题)
  • 如何检测到邮件正在发送给不再收听的客户端?(如果我想实现某种连接清理)

Ale*_*ell 1

好吧,我会在这里冒险。

免责声明:不管您将在下面阅读什么,您可能想从这里开始

我对 scala 不熟悉,但它使用与 Erlang 类似的原理,我在那里感觉有点舒服。然而,让我对你的问题感到困惑的事情与此无关。但更多的是您似乎正在建立的客户端-服务器关系。

根据定义,服务器不会继续向客户端发送消息,除非它收到请求。也就是说,服务器参与者类应该围绕检查接收到的消息并采取相应行动的 case 语句构建(不一定总是)。因此,在这种情况下,客户端是存在的,服务器不应该担心它,而是正常发送其回复消息,因为客户端只是通过请求来了解其存在。

因此,如果您的服务器仍在尝试向客户端发送消息,尽管这些客户端已关闭,但在我看来,尽管没有收到任何请求,但它仍在尝试发送消息。在客户端-服务器关系的上下文中,这是根本错误的。服务器应该只对请求做出反应。否则它就会扮演客户的角色。

无论如何,您可以(并且应该)定义任何客户端-服务器对话的结束。这将有助于释放资源并结束已建立的连接。为了达到这个效果:

  1. 您的客户端 Actor 应该向服务器发送一条停止消息,并使用 scala 为 Actor 类实现的任何退出函数终止其执行。

  2. 收到停止消息后,服务器参与者不应回复客户端。相反,它应该像客户端参与者一样进行清理(如果有)并终止执行。

通过这种方式,您可以确保正确终止所有涉及的参与者并正确释放资源。

我希望这能有所帮助。不幸的是我对scala本身并不熟悉。否则我可以引入一些代码。但希望上面的链接应该有所帮助。

  • 恐怕这种方法行不通。您无法保证 *stop* 方法被发送到服务器,当发生这种情况时,客户端 Actor 的服务器端通道 *proxy* 的邮箱会被填满,最终服务器会因内存不足而崩溃。我发现唯一的机制是客户端在计时器上续订“租约”:服务器定期检查租约,任何过期的租约都会被丢弃 (2认同)