Akka 道具给阿克卡的演员创作带来了什么好处?

Akka 道具给阿克卡的演员创作带来了什么好处?,akka,actor,prop,Akka,Actor,Prop,作为Akka的新手,我需要帮助以一种简单的方式理解道具的好处。创建通用OO风格的对象有什么问题 我所知道的是,这遵循工厂模式,您将道具中的类和属性发送到工厂,并为您创建参与者。[如果我错了,请纠正我] 但我看不到这种必要性,我知道这是根本性的。这就是我的困境 你能帮我理解这可能是一个类比/代码吗 我认为这种创造演员的方式有两个好处 第一个很简单:它保证当创建Actor对象时,它也在Actor系统中正确注册(它必须有一个父Actor来监督它,由调度器获取推送消息,等等)。因此,您永远不会得到类型为

作为Akka的新手,我需要帮助以一种简单的方式理解道具的好处。创建通用OO风格的对象有什么问题

我所知道的是,这遵循工厂模式,您将道具中的类和属性发送到工厂,并为您创建参与者。[如果我错了,请纠正我]

但我看不到这种必要性,我知道这是根本性的。这就是我的困境


你能帮我理解这可能是一个类比/代码吗

我认为这种创造演员的方式有两个好处

第一个很简单:它保证当创建
Actor
对象时,它也在Actor系统中正确注册(它必须有一个父Actor来监督它,由调度器获取推送消息,等等)。因此,您永远不会得到类型为
Actor
,但实际上存在于Actor系统之外的对象

第二个在
actorOf(props:props):ActorRef
方法的定义中可见:它实际上并不返回
Actor
,而是返回
ActorRef
(并且
ActorRef
也不公开对底层
Actor
的引用)


这意味着您永远无法直接访问actor本身,也无法通过直接调用actor上的方法而不是发送异步消息来绕过akkaapi。如果您自己构建了
Actor
,您显然可以直接访问Actor,这使得访问Actor变得太容易了,从而破坏了Actor模型的保证。

我认为这也没有任何优势。 事实上,这是为了让我理解API

为什么不这样:

ActorRef actorA = system.getRefByCreateActor(ActorA.class, Props.create(......));

NoSender.tell(actorA, message);

Akka中使用道具的主要原因是
Actor
实例的生命周期完全由
ActorSystem
管理

在最简单的情况下,您的
Actor
将被实例化一次,然后愉快地继续。如果这是唯一的用例,那么标准的依赖注入方法可能会起作用

然而,一旦Akka监督机制生效,最简单的案例就被抛到了窗外。在Akka中,当一个
参与者
抛出一个
异常
,一个监督机制决定该参与者应该发生什么。通常,主管必须决定是否:

  • 异常是预期的,不会真正导致问题=>参与者将恢复并继续正常运行
  • 异常是致命的,不能允许参与者继续=>参与者被杀死,其邮箱被破坏,它包含的所有邮件都被发送到死信
  • 异常不正确,但可恢复=>参与者已重新启动。这意味着现有的
    Actor
    实例将被丢弃,但其邮箱将被保留。将从
    道具
    创建一个新的
    演员
    实例,并将开始处理原始邮箱
处理重启案例需要
道具
机构

我相信,在创建分布式
ActorSystem
时,Props机制也很有用,因为它允许在必要时在另一个JVM上实例化
Actor

所有这些情况都不能通过标准工厂模式或标准依赖项注入机制来处理