Akka.net 中的 IActorRef 过多

too many IActorRefs in Akka.net

假设我有以下 Actor 层次结构:

user
|____A___|---E
|        |---F
|        |---G
|
|____B___I
|____C___J
|____D___K

假设 Actor E 需要有 I、J、K 的 IActorRef,如果系统扩展并需要更多的 Actors 和用户 ActorSelection not advised to use locally,那么在构造函数中传递 ActorRef 会变得混乱。 =13=]

随着系统的扩展,是否有一种适当且动态的方式来获取 ActorRef?

我想了很多关于我是否应该问这个问题,因为它可以解释为基于意见的问题,但我真的在为这个问题而苦苦挣扎,因为我已经搜索了很多而且还不清楚是什么这个问题的最佳实践,因为代码会随着时间的推移变得非常混乱和不可读。

只需开始发送消息,而不是尝试 pre-configure Actor 与(许多)其他 Actor。当有许多不同 Actor 时,它确实使初始化变得复杂。另外:您不能将传递给构造函数的 IActorRef 句柄视为静态且永远有效:当 Actor 离线时,您需要一种机制来检测它并将其句柄清空,或删除它。集群中的其他 Actor 需要查看 Akka 日志消息.. 无法保证.. 等..

相反:当您将新的 Actor 连接到集群时,通过 pubsub 发出(推送)您的身份。您的新 Actor 消息可能是:ActorSytem.Name+IActorRef+RoleString.

https://getakka.net/articles/clustering/distributed-publish-subscribe.html

RoleString 是您的 Actor 任务的描述符。其他演员可以根据 RoleString 决定注册您的 IActorRef。

在此过程中,pubsub 的其他订阅者(Actor)将获取您的身份并存储您的身份。然后,他们通过相同的 pubsub 以相同的方式发出他们的身份。因此,您将在响应中收到所需的 RoleString 身份……并且其他集群节点(Actor)知道您的存在。

当 Actor 需要断开连接时,首先发出 pubsub 消息,然后再实际断开 Actor 与集群的连接。这样做,其他演员就知道演员下线了。

此策略的一个陷阱:防止无休止的 pubsub 循环(I/O avalange)。我使用的解决方案:通过测试自上一条 pubsub 消息以来的时间来防止 Actor 发送过多消息。把例如每分钟 1 条消息,与其他 Actor 无关。这将导致心跳,而不是大量消息。您会定期收到所有 Actor 的在线状态通知。在这种情况下不需要 exit/offline 消息。

所以我查阅了文档并仔细阅读,我发现有两种方法可以干净地获取 IActorRef。

默认方式是使用 ActorSelection 并等待回复,从该回复中您使用 Sender 属性 并存储 IactorRef 。您可以使用内置消息 Identify,一旦发送给参与者,接收方将自动回复 ActorIdentity 包含 IActorRef

的消息

可以找到完整的例子here