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
假设我有以下 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