我正在使用 Akka.NET 实现一个演员系统,其中一些演员是按需创建的,并在可配置的空闲期后被删除(为此我使用 Akka 的“ReceiveTimeout”机制)。这些参与者中的每一个都由一个密钥标识,并且不应存在两个具有相同密钥的参与者。
这些参与者当前由一个共同的主管创建和删除。如果具有此键的参与者尚不存在,则可以要求主管返回对匹配给定键的参与者的引用,方法是返回现有的或创建新的。当演员收到“ReceiveTimeout”消息时,它会通知主管,主管反过来用“PoisonPill”杀死它。
在删除其中一个演员后立即向其中一个演员发送消息时,我遇到了问题。我注意到向死去的演员发送消息不会产生异常。更糟糕的是,当发送“询问”消息时,发送者仍然被阻止,无限期地等待(或直到超时)等待他永远不会收到的响应。
我首先想到了 Akka 的“Deatchwatch”机制来监控演员的生命周期。但是,如果我没记错的话,监视actor发送的“终止”消息将像任何其他消息一样被监控actor异步接收,因此问题可能仍然发生在目标actor死亡和接收它之间“终止”消息。
为了解决这个问题,我这样做是为了让任何要求主管参考这样一个演员的人都必须向主管发送一个“关闭会话”消息,以便在他不再需要它时释放演员(这是透明地完成的由一次性“ActorSession”对象)。只要演员有任何打开的会话,主管就不会删除它。
我想这种情况很常见,因此我想知道是否没有更简单的模式可以解决这类问题。任何建议将不胜感激。