Akka.net中的IACorRef太多



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

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

假设Actor E需要具有Actor I、J、K的IActorRef,如果系统扩展并需要更多Actor,并且用户ActorSelection不建议在本地使用,则在构造函数中传递Actor Ref会变得混乱。

有没有一种适当的、动态的方法可以在系统缩放时获得ActorRef?

我想了很多是否应该问这个问题,因为它可以被解释为基于观点的问题,但我真的很难理解这个问题,我已经搜索了很多,还不清楚解决这个问题的最佳实践是什么,因为代码可能会变得非常混乱和不可读。

只需开始发送消息,而不是尝试用(许多(其他Actor预配置Actor。当有许多不同的参与者时,它确实使初始化变得复杂。此外:您不能将传递给构造函数的IACorRef句柄视为静态且永远有效:当Actor脱机时,您需要一种机制来检测该句柄并将其置空或删除。集群中的其他Actor需要查看Akka日志消息。。不保证。。等等。

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

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

RoleString是Actor任务的描述符。其他参与者可以根据RoleString决定注册您的IACorRef。

在此过程中,pubsub的其他订阅者(参与者(将获取您的身份并存储您的身份。然后,他们以相同的方式,通过相同的pubsub来发布自己的身份。因此,您将在响应中收到所需的RoleString标识。。并且其他集群节点(Actors(知道您的存在。

当Actor需要断开连接时,在实际断开Actor与集群的连接之前,先发出一条pubsub消息。这样一来,其他演员就知道这位演员越界了。

这种策略的一个陷阱是:防止无休止的pubsub循环(I/O avarange(。我使用的解决方案是:通过测试自上一条pubsub消息以来的时间,防止Actor发送过多消息。例如,不管其他参与者如何,每分钟发送一条信息。。这将导致心跳,而不是大量的消息。你会定期了解所有演员的在线状态。在这种情况下,不需要退出/脱机消息。

所以我查阅了文档并仔细阅读了它,我发现有两种方法可以以干净的方式获得IACorRef。

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

完整的例子可以在这里找到

最新更新