首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Akka:演员网络模式

Akka:演员网络模式
EN

Stack Overflow用户
提问于 2022-02-20 08:55:12
回答 1查看 44关注 0票数 0

我的任务是通过使用Akka aktors来模拟网络节点之间的交互。目标模型包含节点,每个节点都向其他节点发送和接收消息。

因此,在参与者方法中,每个参与者在开始之前都必须获得所有其他参与者的引用,并向其发送消息。

这似乎是通过构造器参数传递这个参考的简单方法:

代码语言:javascript
复制
  val node1 = context.spawn(Node(), "node1")
  val node2 = context.spawn(Node(node1), "node2")

问题是node1没有在构造函数中获得node2上的ActorRef。如果在创建"node1“后有方法更新参与者"node2",那么问题就不会出现。但是,据我所知,更新演员不是由Akka提供的。

我发现的其他(工作)方式是使用特殊的执行信息:

一开始,家长演员会生孩子:

代码语言:javascript
复制
  case class Refs(Set[ActorRef[Node]])

  val node1 = context.spawn(Node(), "node1")
  val node2 = context.spawn(Node(), "node2")

第二,它向它们发送消息,其中包含对每个创建的子参与者的参考信息集。

代码语言:javascript
复制
  val refs = Inialise(Set(node1, node2))

  context.children.foreach(child => child ! refs)

只有在收到Inialise消息后,每个孩子才开始发送和接收任何消息。

有其他方法(模式)来实现这个任务吗?在https://doc.akka.io/docs/akka/current/typed/interaction-patterns.html#scheduling-messages-to-self 交互模式中,我也没有发现任何变体。

我查看了EventBus和preStart生命周期方法,但我不确定。

EN

回答 1

Stack Overflow用户

发布于 2022-02-20 13:03:57

如果您想要实现一个定义的拓扑结构,那么在设置了所有参与者之后发送Initialise消息很可能是实现这一目标的最清晰的方式。

另一种方法是允许连接节点的节点集具有更大的动态性,其中包含一个AddLink (或其他什么)消息,当一个节点以链接到现有节点的链接启动时发送该消息:

代码语言:javascript
复制
val node1 = context.spawn(Node(), "node1")
val node2 = context.spawn(Node(node1), "node2")

当node2启动时,它会向node1发送一条AddLink(context.self)消息,因为它了解node1。

另一种选择可能是创建一个节点参与者,要求引用一个可以回答“我应该与谁互连”的问题的参与者?(这个演员可以是ActorSystem的父参与者,甚至是监护人,但是即使在那里,显式地传递一个ActorRef (而不是依赖于context.parentcontext.system:这些都需要unsafeUpcast)可能更好)。在启动时,您的节点询问该参与者,该参与者跟踪挂起的请求、所需的拓扑,以及哪些参与者进行了询问(从而注册了自己),以便一旦将请求者链接到存在的所有节点后,它都会回复。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71192808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档