微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么时候可以在初始创建 actor 时重新排序初始消息?

如何解决什么时候可以在初始创建 actor 时重新排序初始消息?

在 Akka 中,消息排序仅在“给定的一对参与者”(source)之间得到保证。

同一页面还说明“此规则不可传递”,并给出了演员 A 向演员 M1 发送消息 C,然后向演员 M2 发送消息 B 的理论示例演员 C 将其转发给演员 C。因此,演员 M1 可以按任意顺序接收 M2HelloWorldMain

页面还强调了创建参与者与向其发送消息的方式相同,因此,任何其他外部参与者最终如何向尚不存在的参与者发送消息:

Actor 创建被视为从父级发送到 child,与上面讨论的语义相同。发送消息 以一种可以用这个初始值重新排序的方式给演员 创建消息意味着消息可能不会到达,因为 演员尚不存在。 [...] 定义明确的排序的一个例子是 一个创建actor并立即向它发送消息的父级。

到目前为止一切顺利。问题是,据我所知(我是 Akka 的新手!),Akka 代码中最常用的模式是让一个 actor 产生子代,然后他们共享的父代启动子代之间的通信,因此,这是不是“定义明确的排序”。世界上大多数基于 Akka 构建的应用程序是否已从根本上崩溃,等待发生的事故?

这里有一些来自 Akka 的例子。

this page 上,它们有一个 HelloWorld,它产生两个孩子 HelloWorldBothelloWorld.tell()。然后,main 调用 HelloWorldBot,并将 Main 设置为回复引用。

同一页面ActorRef<ChatRoom.RoomCommand> chatRoom = context.spawn(ChatRoom.create(),"chatRoom"); ActorRef<ChatRoom.SessionEvent> gabbler = context.spawn(Gabbler.create(),"gabbler"); context.watch(gabbler); chatRoom.tell(new ChatRoom.GetSession("ol’ Gabbler",gabbler)); 类的更下方更清楚地重复此模式:

      fluidRow(
        #valueBoxOutput("prescripciones_covid"),column(4,offset = 4,plotlyOutput('plot1')   
      
      )),fluidRow(
            hr(style = "border-top: 1px solid #000000;"))

引用的第一页给出了一个可能出错的例子;如果“远程部署的参与者 R1,将其引用发送到另一个远程参与者 R2 并让 R2 向 R1 发送消息”。这是显而易见的情况。但由于我有点不喜欢编写可能无法按预期工作的应用程序,那么我需要了解的具体情况是什么?远程处理只是其中之一 - 或者,我怀疑,可能是唯一的一个?而且,我可以使用什么模式来使最初的沟通按计划进行?例如,我是否应该在显示对下一个孩子的引用之前等待一个 actor-start 事件(如果 Akka 中甚至有这样的“信号”)?

我知道不能保证传递任何消息-因此,即使不产生一个孩子也一定会真正开始那个孩子哈哈。但是,这是一个单独的主题。我特别关心的是孩子的创造以及他们之间的初始沟通,Akka 明确强调应该遵循“明确定义”的顺序,然而,实际上似乎没有人真正做到 ???

解决方法

“与创建相比,初始消息何时会被重新排序?”

简短回答:从不。如果您创建一个参与者,ActorRef 立即有效,可以立即接收消息,并且在处理消息之前将处于有效状态。

更长的答案:如果您不直接生成actor,则可能会发生重新排序。因为,正如您所注意到的,排序保证仅适用于从一个给定的演员到另一个演员。因此,如果您引入中介,则保证不再适用。可能发生这种情况的一种情况是使用 远程角色创建,这就是文档中提到它的原因。但是远程actor创建并不是一个典型的场景。

META:我现在完全重写这个答案,使其更加简洁,因为我认为我更好地理解了这个问题。 (如果您想查看原始的漫无边际的答案,请随时使用版本控制功能。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。