1

你好,这是一个非常简单的问题,我已经看到并阅读了人们写的地址可以指向多个演员。我想知道为什么?这样的用例是什么。

假设路由器参与者可以有一个地址,但是在消息上它可以将消息发送给多个参与者,但它的每个子节点仍然可能只有一个地址。

谢谢

4

1 回答 1

1

首先,让我们分析您的示例:确实,消息有效负载可以传递给多个参与者,正如您所描述的(即通过路由器),以及通过 pub-sub 模式。

我认为,pub-sub 更好,因为方便,因为中间不需要额外的演员(路由器)。另一个原因是在 pub-sub 情况下耦合较少:要订阅和发布消息,只需要知道地址,同时在路由器情况下,下游参与者还必须至少知道路由器地址和“订阅协议” ",(例如,donwstream.send<subscribe_me, message_type>(router_address, donwstream.address)或者下游参与者必须知道路由器类实例,并且(在最坏的情况下)它们必须是路由器的子级(或由路由器拥有) - 例如(router.subscribe(downstream_actor))。

最后一个可能很重要并且取决于实现的原因,即传递的消息不同:在 pub-sub 模型中,原始消息是为多个参与者传递的,在路由器的情况下,原始消息的多个克隆交付。

其次,具有参与者多地址的多种模式是可能的。这里有一些例子:

  • 参与者的行为可能不同,无论同一类型的消息被传递到一个或其他参与者的地址,例如,如果参与者拥有一些有限的资源,比如内存,并且当它即将耗尽资源时,它可能会以拒绝的方式回答它是“主要”地址,并且仍然在“关键”地址上提供资源。如果没有多地址,您必须在 2 个不同的参与者之间共享资源(不鼓励)或拥有 2 种不同类型的消息(更好)。
  • 转子中(免责声明:我是作者),一个参与者可以订阅另一个服务参与者地址以获得一些静默副作用,即用于审计或记录服务参与者的消息。
  • 由于多寻址,可以实现消息监督,例如在转子中,请求-响应模式通过以下方式实现:请求通过监督者路由,监督者生成计时器和新地址(X),并发送有效载荷副本到原来的目的地;然后响应到达(X),它只是转发给请求参与者并且定时器被取消;但是,如果计时器触发,主管会创建一条带有错误代码(超时)的新消息,并将其传递回请求参与者。
  • NAT这样的东西是可能的,即当2个节点连接时,这里需要从actorA从node1传递一个消息到actorB node2,消息实际上可以只是传递到node1上代表actorB的NAT-actor的唯一地址,序列化它以特殊方式通过网络发送。反向过程将在 node2 上发生。在这种情况下,NAT-actor 将有多个地址(如真实路由器中的端口),并且对于 actorA 和 actorB 仍然是透明的。
于 2020-07-21T06:01:27.797 回答