假设我有以下的Actor层次结构:
user
|____A___|---E
| |---F
| |---G
|
|____B___I
|____C___J
|____D___K让我们假设Actor E需要IActorRef的Actors I,J,K,如果系统扩展和需要更多的Actor,用户ActorSelection 不建议在本地使用就会在构造函数中传递IActorRef。
是否有一种适当的、动态的方法来获取ActorRef作为系统规模?
我考虑过是否应该问这个问题,因为它可以解释为基于意见的问题,但是我真的对这个问题很不信任,因为我已经搜索了很多,而且还不清楚这个问题的最佳实践是什么,因为代码可能会变得非常混乱和无法及时阅读。
发布于 2020-08-14 09:27:22
因此,我查找了文档并彻底阅读了它,我发现有两种方法可以以干净的方式获得IActorRef。
默认的方法是使用ActorSelection并等待回复,从该回复中可以使用Sender属性并存储IactorRef。您可以使用builtIn消息Identify,一旦发送给参与者,接收方将自动回复包含IActorRef的ActorIdentity消息。
一个完整的示例可以找到这里
发布于 2020-08-13 18:33:47
只需开始发送消息,而不是试图与(许多)其他Actor预先配置Actors。当有许多不同的行为者时,这使得初始化变得非常复杂。另外:不能将传递给构造函数的IActorRef句柄视为静态的和永久有效的:当Actor脱机时,您需要一种机制来检测该句柄并使其句柄无效,或删除它。集群中的其他参与者需要查看Akka日志消息。不能保证..。等等。
相反,当您将一个新的Actor连接到集群时,通过pubsub发出(推送)您的身份。您的新演员信息可能是: ActorSytem.Name+IActorRef+RoleString。
https://getakka.net/articles/clustering/distributed-publish-subscribe.html
RoleString是Actor任务的描述符。其他参与者可以基于IActorRef决定注册您的RoleString。
在此过程中,其他订阅者(演员)将获取您的身份并存储您的身份。然后,他们以同样的方式,通过同样的阴阳发出他们的身份。因此,您将收到响应中所需的RoleString标识。而其他集群节点(Actors)知道您的存在。
当Actor需要断开连接时,首先发出一个pubsub消息,然后实际将Actor与集群断开连接。这样做,其他演员都知道演员出轨了。
这个策略的一个陷阱是:防止无尽的公共循环(I/O雪崩)。我使用的解决方案:通过测试之前发布的消息的时间来防止Actor发送过多的消息。每分钟写一条信息,而不管其他演员。这将导致心跳,而不是大量的信息。你将定期被告知所有演员的在线状态。在这种情况下,不需要退出/脱机消息。
https://stackoverflow.com/questions/63398330
复制相似问题