Actor 发现
对于「非类型化的 Actor」,你将使用来查找 Actor。给定一个包含地址信息的 Actor 路径,你可以为任何 Actor 获取ActorRef
。在 Akka 类型中不存在ActorSelection
,那么如何获取 Actor 引用呢?你可以在消息中发送refs
,但需要一些东西来引导交互。
为此,有个 Actor 叫Receptionist
。你注册了应该可以从本地Receptionist
实例中的其他节点发现的特定 Actor。Receptionist
的 API 也基于 Actor 消息。然后,Actor 引用的注册表将自动分发到集群中的所有其他节点。你可以使用注册时使用的键查找这些 Actor。对这样一个Find
请求的答复是一个Listing
,其中包含为键注册的一组 Actor 引用的Set
。请注意,可以将多个 Actor 注册到同一个键。
注册表是动态的。新的 Actor 可以在系统的生命周期中注册。当已注册的 Actor 停止或节点从群集中删除时,条目将被删除。为了方便这个动态方面,你还可以通过发送消息来订阅更改。当某个键的条目被更改时,它将向订阅服务器发送Listing
消息。
以下示例中使用了这些导入:
首先,我们创建一个PingService
Actor,并根据一个ServiceKey
向Receptionist
注册它,该ServiceKey
稍后将用于查找引用:
然后我们有另一个 Actor 需要构造PingService
:
每次注册一个新的(本例中只有一次)时,守护者 Actor 都为每个当前已知的PingService
生成一个Pinger
。Pinger
发送一个Ping
消息,当接收到Pong
回复时,它将停止。
Receptionist
也在集群中工作,注册到Receptionist
的 Actor 将出现在集群其他节点的Receptionist
中。
Receptionist
的状态通过传播,这意味着每个节点最终都将达到每个的同一组 Actor。
英文原文链接:Actor discovery.