我正在使用Akka.NET实现一个演员系统,在该系统中,一些演员是按需创建的,并在可配置的空闲期后删除(我使用Akka的“ReceiveTimeout”机制来实现)。每个演员都由一个键标识,并且不应存在两个具有相同键的演员。
这些演员目前由一个常规监督者创建和删除。监督者可以被要求返回与给定键匹配的演员的引用,无论是返回现有的还是创建新的,如果不存在具有此键的演员。当演员接收到“ReceiveTimeout”消息时,它会通知监督者,监督者再使用“PoisonPill”杀死它。
当我在演员被删除后立即向其中一个演员发送消息时,出现了问题。我注意到向已死亡的演员发送消息不会生成异常。更糟糕的是,当发送“Ask”消息时,发送方仍然被阻塞,无限期地等待响应,但永远不会收到响应。
我最初考虑使用Akka的“Deatchwatch”机制来监视演员的生命周期。但是,如果我没有弄错,垂死的演员发送的“Terminated”消息将像任何其他消息一样异步地被监视演员接收,因此在目标演员死亡和接收其“Terminated”消息之间仍可能出现问题。
为了解决这个问题,我让任何向监督者请求这样一个演员引用的人都必须向监督者发送一个“关闭会话”消息,在他不再需要它时释放演员(这是由一个可处理的“ActorSession”对象透明地完成的)。只要演员有任何开放的会话,监督者就不会删除它。
我想这种情况很常见,因此想知道是否有更简单的模式可以遵循来解决这种问题。任何建议都将不胜感激。
这些演员目前由一个常规监督者创建和删除。监督者可以被要求返回与给定键匹配的演员的引用,无论是返回现有的还是创建新的,如果不存在具有此键的演员。当演员接收到“ReceiveTimeout”消息时,它会通知监督者,监督者再使用“PoisonPill”杀死它。
当我在演员被删除后立即向其中一个演员发送消息时,出现了问题。我注意到向已死亡的演员发送消息不会生成异常。更糟糕的是,当发送“Ask”消息时,发送方仍然被阻塞,无限期地等待响应,但永远不会收到响应。
我最初考虑使用Akka的“Deatchwatch”机制来监视演员的生命周期。但是,如果我没有弄错,垂死的演员发送的“Terminated”消息将像任何其他消息一样异步地被监视演员接收,因此在目标演员死亡和接收其“Terminated”消息之间仍可能出现问题。
为了解决这个问题,我让任何向监督者请求这样一个演员引用的人都必须向监督者发送一个“关闭会话”消息,在他不再需要它时释放演员(这是由一个可处理的“ActorSession”对象透明地完成的)。只要演员有任何开放的会话,监督者就不会删除它。
我想这种情况很常见,因此想知道是否有更简单的模式可以遵循来解决这种问题。任何建议都将不胜感激。