Akka中父Actor可否将子Actor引用作为成员变量用于消息发送
Akka父子Actor通信方案选择
结论
父Actor A创建子Actor B的场景下,直接在A中定义ActorReference<B>类型的成员变量存储B的引用,通过该变量直接发消息即可,完全不需要将B注册到Receptionist再做发现。
原因说明
- 父Actor spawn 子Actor时会直接返回合法的
ActorReference,这个引用是Akka框架天然保证可用性的:只要子Actor没有被主动停止,哪怕子Actor发生重启,该引用也不需要手动更新,Akka会自动将消息路由到重启后的子Actor实例。 - Receptionist的设计定位是解决跨层级、跨节点、无上下文关联的Actor服务发现问题,比如分布式集群下不同节点的Actor需要互相访问、或者两个没有创建/从属关系的独立Actor需要通信时才需要使用。父子Actor属于强关联的内部依赖,走Receptionist注册、发现属于完全冗余的操作,还会增加不必要的性能开销和逻辑复杂度。
Receptionist适用场景
只有当你的业务满足以下任意条件时,才需要考虑使用Receptionist的
Find()或者订阅更新机制获取B的引用:
- Actor B需要被多个没有上下文关联的独立Actor访问
- Actor A和B部署在Akka集群的不同节点上
- Actor B的生命周期和A完全解耦,A不需要感知B的创建逻辑
内容的提问来源于stack exchange,提问作者r4bb1t
相关产品推荐
相关产品推荐

