当前位置: 首页 > 知识库问答 >
问题:

在Akka类型持久演员中创建儿童演员

贺善
2023-03-14

让我们假设一个使用Akka Typed实现的应用程序有一个持久执行元。这个持久执行元作为其操作的一部分创建了瞬态(或非持久)子执行元,每个子执行元都有一个唯一的ID,这些ID是持久状态的一部分。持久执行元还需要一些与其子级通信的方式,但我们不希望持久化子级的actorref,因为它们实际上不是状态的一部分。在恢复时,持久参与者应该基于恢复的状态重新创建它的子级。这听起来并不像是一个很不寻常的用例,我正在试图弄清楚什么是实现它的最干净的html" target="_blank">方法。我可以在命令处理程序中的和theneffect中创建子执行元,这是针对副作用的,但是没有办法从那里保存子执行元的actorref。这似乎是类型化持久化API的一个更普遍的特性--在持久化执行元中很难有非持久化状态(在本例中,可用于存储临时子actorref)。我想出的一个解决方案是使用某种“代理”actor来创建子级,保持ID和actorref的映射,并基于ID转发消息。持久执行元持有对该代理执行元的引用,并在每次需要创建新子级或向现有子级之一发送内容时与该代理执行元联系。我对此有复杂的感觉,但如果有人能给我指出一个更好的解决方案,我会很感激。

共有2个答案

东方旺
2023-03-14

类型持久性的一个设计目标是状态可以从事件(或者从快照和该快照之后的事件)完全恢复。

通常,拥有非持久性状态的唯一方法是将EventSourceBehavior包装在设置状态的Behaviors.setup块中。这方面的一个选项是setup中的某种可变状态(例如var或(可能是独占的或)可变集合),命令/事件/恢复处理程序对其进行操作。

一个更不可变的替代方案是在setup中定义一个不可变的fixture,它包括一个在setup中生成的子执行元,用于管理非持久状态。您还可以将诸如实体ID之类的东西或其他至少对于该实体的这个化身是不可变的东西放入fixture中。

巴英韶
2023-03-14

如果不使用快照,则持久性机制不存储state对象,而是存储导致该state对象的event序列。恢复时,它只需按照事件发生的顺序重新播放event,您的eventhandler将返回一个反映每个事件效果的修改过的state对象。

这意味着state对象可以包含本身不持久化的值,而是通过处理某些event来设置的值。实际上,它们是从状态中的持久值派生的缓存值。

在您的示例中,导致创建瞬态执行元的操作将作为执行元上的事件捕获。因此您可以在EventHandler中创建瞬态执行元,并将ActorRef放在新的State对象中。当执行元恢复时,它将重播该事件,您的执行元将重新创建临时执行元。

如果您正在使用快照,那么我不认为需要快照对象与state对象的类型相同,因此您可以在没有actorref的情况下快照状态,并在获得snapshotoffer消息时重新创建它们。

 类似资料:
  • 我对阿克卡很陌生,我有一个(希望)简单的问题。我有一个参与者需要重复执行某个小的子任务——也就是说,每次这个参与者收到消息时,它都必须执行N个子任务。这个子任务是我指定给儿童演员的。我的问题是,我是否应该为每个子任务创建一个新的子角色实例?或者我应该简单地产生一个孩子演员,并发送N条消息?在这种情况下,最好的做法是什么? 为了更好地说明我的问题,这里有两个简化的示例(在Java中-但希望对Scal

  • 我经常发现自己使用一个“主”角色,为子任务创建许多子角色。当子任务完成时,主角也应该停止自己。所以当时,我观察子角色并停止主角色context.children.is。 我经常使用这种模式,但因为我从未读过这方面的文章。我不确定,这是一个好主意还是失败的演员有问题。。。? 我已经读过Akka 2中的关机模式,但是这种方法在Java中似乎比我的解决方案更复杂? 以下是我针对具有两个子任务的主要参与者

  • 我是Akka的新手,我想知道我应该如何处理将工作委托给其他(儿童)演员的演员,但在哪里: 其中一些儿童演员必须按特定顺序参与;和 其中一些子参与者可以以任何顺序参与,并且可以真正地与主/父参与者所做的事情异步执行 假设我有以下儿童演员(不管他们做什么): 假设我有以下调用它们的父参与者: 如你所见: 必须首先“参与”(由家长调用),我们必须等待家长的响应,然后才能继续参与/调用、或 换句话说,当消

  • 我正在用Akka打字,但我无法查看官方文件(https://doc.akka.io/docs/akka/current/typed/actors.html#actors),我发现它非常简短,即如何在Actor类型中配置调度程序。 下面是我的代码示例 当我创建ActorSystem时,如何为我的A配置调度程序ctor.immutable?

  • 我正在学习Akka类型的Actor库,并尝试使用。但是它返回一个类型,而不是我最初创建的子参与者的类型- 我所做的解决方法是在创建时将子对象简单地存储在hashmap中。但这不是一个可伸缩的。 我该如何实现这一点?尤其是在分布式场景下?

  • 我有父母和孩子。每个儿童演员控制一个装置。当我创建所有的子角色时,我给他们一个uuid。 每个子参与者都是通过设备配置创建的,当配置更改时,我希望通过以下方式重新创建参与者: > 停止旧的: 最终的未来停止了=优雅的停止(actorRef,Duration.create(1,时间单位。秒)); Await.result(停止,Duration.create(1, TimeUnit.二)); 重新创