【问题标题】:In Akka, can I spoof a message from a different actor?在 Akka 中,我可以欺骗来自不同参与者的消息吗?
【发布时间】:2012-11-05 21:41:36
【问题描述】:

我正在使用 Akka 来控制对正在运行的系统进程的访问。

我有一个 CommandActor 来处理来自系统中任何 Actor 的传入命令请求(我们称之为 RequestActor),并且对于每个新请求,CommandActor 都会生成一个单独的 CmdChildWorker Actor 来处理该特定请求。 CommandActor 还限制了 CmdChildWorker 的数量,并为每个请求分配了唯一的 id,因此它比简单的路由器更复杂。

当命令完成时,并且在系统进程的执行期间周期性地,CmdChildWorker Actor 将周期性更新发送回原始 RequestActor(例如到目前为止的进程输出)。

但是,为了保持简洁的设计,我希望能够将 CmdChildWorker 完全隐藏在原始 RequestActor 之外,它的唯一接口是单个 CommandActor。

显然,我可以通过 CommandActor 从 CmdChildWorker 发回任何回复消息,但我想知道是否可以直接从 CmdChildWorker 回复 RequestActor 而无需通过 CommandActor 路由消息,但仍然假装消息已从 CommandActor 发回。

即我想将 CmdChildWorker 演员的发件人地址伪装成其父演员的地址。这可能吗?或许更重要的是,这是明智的,还是优秀的演员设计?

谢谢

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    查看 actor 的 tell 方法。当 CommandActor 转发它的消息时,调用:

    childActor.tell(msg, sender)

    并且 childActor 会将其发送者作为原始发送者。

    【讨论】:

    • 谢谢!这回答了如何。你对这是否是一个好的演员设计有看法吗?
    • “好”很难说,因为总有人能想出更好的东西,但我不会说它是坏的。事实上,这就是无类型演员范式的强大之处。坚持下去,直到它不再令人敬畏。
    • 您应该查看一些演员模式演示。通过tell 与不同的发送者将消息传递给工作人员是一种将“状态”附加到事务的非常常见的方法。您基本上构建了一个演员来记住“会话状态”并将所有信息传递给他。他负责回复原始查询。我会说这是一个很好的模式:)
    【解决方案2】:

    如果我正确理解您的要求,您应该使用 forward。来自文档:

    您可以将消息从一个参与者转发给另一个参与者。这意味着即使消息正在通过“中介”,原始发件人地址/参考也会被保留。这在编写充当路由器、负载平衡器、复制器等的 Actor 时很有用。

    myActor.forward(消息)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-22
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 2023-03-28
      • 1970-01-01
      • 2015-09-15
      相关资源
      最近更新 更多