为什么Actor模型中的Actor可以有多个地址
Why Actors in Actor Model can have multiple adresses
你好,这是一个非常直截了当的问题,我看到并读到过人们写道地址可以指向多个参与者。我想知道为什么?这样的用例是什么。
假设路由器 actor 可以有一个地址,但是在消息上它可以将消息分派给多个 actor 但它的每个子节点仍然可能只有一个地址。
谢谢
首先,让我们分析一下你的例子:事实上,一条消息 payload 可以传递给多个参与者,正如你所描述的(即通过路由器),以及通过 pub-sub 模式 .
我认为 pub-sub 更好,因为方便,因为不需要额外的参与者(路由器)in-between。另一个原因,在 pub-sub 情况下耦合度较低:要订阅和发布消息,只需要知道 地址 ,同时在路由器情况下,下游参与者还必须至少知道路由器地址和“订阅协议”,(例如 donwstream.send<subscribe_me, message_type>(router_address, donwstream.address)
或下游参与者必须知道路由器 class 实例并且(在更坏的情况下)它们必须是 children 路由器(或由路由器拥有)- 例如 (router.subscribe(downstream_actor)
).
关于这一点的最后一个原因可能很重要并且取决于实现,即传递的消息不同:在 pub-sub 模型中,原始消息是为多个参与者传递的,在路由器中发送原始消息的多个克隆的情况。
其次,演员multi-addressing的多种模式是可能的。这里有几个例子:
- 演员的行为可能不同,无论相同类型的消息是否发送到一个或其他演员的地址,例如如果 actor 拥有一些有限的资源,比如内存,当它快要用完资源时,它可能会拒绝它的“主要”地址,并仍然在“关键”地址上提供资源。如果没有 multi-addressing,您必须在 2 个不同的参与者之间共享资源(气馁)或拥有 2 种不同类型的消息(更好)。
- 在 rotor(免责声明:我是作者)中,一个演员可以订阅另一个 service-actor 地址以获得某些 silent-side 效果,即审核或记录消息service-actor.
- 消息supervising可以执行是因为multi-addressing,例如在 rotor 中,request-response 模式是通过以下方式实现的:请求通过主管路由,生成一个计时器和一个新地址 (X),然后发送到原始目的地的有效负载副本;然后响应到达 (X),它只是转发到 requesting-actor 并且定时器被取消;但是,如果计时器触发,主管会创建一条带有错误代码(超时)的新消息,并将其返回给 requesting-actor.
- 类似NAT的事情是可能的,即当2个节点连接时,这里需要从actorA从node1传递消息到actorB node2,消息实际上可以传递到唯一地址NAT-actor 在代表 actorB 的节点 1 上,以特殊方式将其序列化并通过网络发送。反向过程将发生在 node2 上。在那种情况下 NAT-actor 将有多个地址(就像真实路由器中的端口),并且对于 actorA 和 actorB 仍然是透明的。
你好,这是一个非常直截了当的问题,我看到并读到过人们写道地址可以指向多个参与者。我想知道为什么?这样的用例是什么。
假设路由器 actor 可以有一个地址,但是在消息上它可以将消息分派给多个 actor 但它的每个子节点仍然可能只有一个地址。
谢谢
首先,让我们分析一下你的例子:事实上,一条消息 payload 可以传递给多个参与者,正如你所描述的(即通过路由器),以及通过 pub-sub 模式 .
我认为 pub-sub 更好,因为方便,因为不需要额外的参与者(路由器)in-between。另一个原因,在 pub-sub 情况下耦合度较低:要订阅和发布消息,只需要知道 地址 ,同时在路由器情况下,下游参与者还必须至少知道路由器地址和“订阅协议”,(例如 donwstream.send<subscribe_me, message_type>(router_address, donwstream.address)
或下游参与者必须知道路由器 class 实例并且(在更坏的情况下)它们必须是 children 路由器(或由路由器拥有)- 例如 (router.subscribe(downstream_actor)
).
关于这一点的最后一个原因可能很重要并且取决于实现,即传递的消息不同:在 pub-sub 模型中,原始消息是为多个参与者传递的,在路由器中发送原始消息的多个克隆的情况。
其次,演员multi-addressing的多种模式是可能的。这里有几个例子:
- 演员的行为可能不同,无论相同类型的消息是否发送到一个或其他演员的地址,例如如果 actor 拥有一些有限的资源,比如内存,当它快要用完资源时,它可能会拒绝它的“主要”地址,并仍然在“关键”地址上提供资源。如果没有 multi-addressing,您必须在 2 个不同的参与者之间共享资源(气馁)或拥有 2 种不同类型的消息(更好)。
- 在 rotor(免责声明:我是作者)中,一个演员可以订阅另一个 service-actor 地址以获得某些 silent-side 效果,即审核或记录消息service-actor.
- 消息supervising可以执行是因为multi-addressing,例如在 rotor 中,request-response 模式是通过以下方式实现的:请求通过主管路由,生成一个计时器和一个新地址 (X),然后发送到原始目的地的有效负载副本;然后响应到达 (X),它只是转发到 requesting-actor 并且定时器被取消;但是,如果计时器触发,主管会创建一条带有错误代码(超时)的新消息,并将其返回给 requesting-actor.
- 类似NAT的事情是可能的,即当2个节点连接时,这里需要从actorA从node1传递消息到actorB node2,消息实际上可以传递到唯一地址NAT-actor 在代表 actorB 的节点 1 上,以特殊方式将其序列化并通过网络发送。反向过程将发生在 node2 上。在那种情况下 NAT-actor 将有多个地址(就像真实路由器中的端口),并且对于 actorA 和 actorB 仍然是透明的。