加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Akka模式 – 演员树,回复原始来源

发布时间:2020-12-16 19:04:45 所属栏目:安全 来源:网络整理
导读:这是一个设计问题; 说我有一堆演员做一堆处理.处理由客户端/连接actor(即树是服务器)启动.最终,客户演员想要回应.即我有一个像这样的演员系统. ActorA ---reqData--- Client_Actor | msgA /| |/ | ActorB | msgB | msgD | |/ / | ActorC ActorD-------
这是一个设计问题;

说我有一堆演员做一堆处理.处理由客户端/连接actor(即树是服务器)启动.最终,客户演员想要回应.即我有一个像这样的演员系统.

ActorA  <---reqData--- Client_Actor
       | msgA                    /|                      
      |/                         |                 
    ActorB                        |                  
  msgB |   msgD                  | 
      |/  /                     | 
    ActorC  ActorD---------msgY-->|
       |_____________msgX_________|

客户端系统需要的响应是来自叶子角色(即ActorC和/或ActorD)的输出.树中的这些演员可能会与外部系统进行交互.该树可以是一组预先定义的可能路由的演员(即,所以Client_actor刚刚具有到演员树的根ActorA的actorref).

问题是什么是最好的模式来管理将回复(msgX和/或msgY)从最终/叶子的演员返回到客户端演员?

我可以想到以下选项;

>为每个连接客户端创建一个树,并让演员跟踪发送者,当他们收到一个msgX或者msgY时,将它发送回原始的发送者ref,以便消息通过树返回.每个演员将保留原始发件人的参考.
>以某种方式,在reqData消息中发送Client_Actor参考,并将其复制到树中使用的所有消息,以便leaf actors可以直接回复Client_actor …这似乎是最具性能的选项.不确定如何做到这一点(我正在考虑一个特征在消息案例类持有客户端演员ref)…
>以某种方式查找客户端actor,基于通过树中传递的消息中的唯一ID,或者使用actorselection(不知道这可以用于远程处理)
>更好的东西

我使用Akka 2.2.1.

干杯!

解决方法

您可以使用转发方法将邮件从原始发件人转发到每个级别的子发件人.

在Client_Actor中:

actorA ! "hello"

在ActorA中:

def receive = {
  case msg =>
    ???
    actorB forward msg
}

在演员B:

def receive = {
  case msg =>
    ???
    actorC forward msg
}

在ActorC:

def receive = {
  case msg =>
    ???
    sender ! "reply" // sender is Client_Actor!
}

在这种情况下,消息的“发件人”字段永远不会更改,因此ActorC将回复原始的Client_Actor!

您可以通过使用让您指定发件人的tell方法变体来进一步扩展:

destinationActor.tell("my message",someSenderActor);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读