0

假设我希望用演员来模拟一个物理个体。这样的人有多个别名(都是唯一的),即电子邮件地址、社会安全号码、护照号码等。

我想合并与任何别名关联的所有数据。

例子

Transaction - ID

#1 - A,B
#2 - B,C
#3 - D

如果我通过 ID 分配参与者地址,我应该只有 2 个参与者,第一个参与者有 3 个不同的地址(A、B、C)并包含事务 #1 和 #2。第二个地址为 D(但不仅限于 D),交易 #3。

#1, #2 - A,B,C   [Actor 1]
#3 - D           [Actor 2]

此外,如果事务#4 应该以 ID [C,D] 到达,我将留下 1 个包含所有事务和所有别名 (A,B,C,D) 的参与者。

#1,#2,#3,#4 - A,B,C,D   [Actor 1]

一个演员可以有多个地址,还是有一个替代的惯用模式来组合演员?

4

1 回答 1

2

一个演员只有一个地址。

但是您可以将每个别名建模为将消息转发到目标的参与者。

这方面的一个例子是(在 Scala 中,无类型/经典 Akka ......Props为简洁起见省略了构造函数参数,实例等)

object AliasActor {
  case class AliasFor(ref: ActorRef)
}

class AliasActor extends Actor {
  import AliasActor.AliasFor

  override def receive: Receive = {
    case AliasFor(ref) =>
      // If there's some state associated with this alias that should be forwarded, forward it here
      context.become(aliased(ref))
  }

  def aliased(ref: ActorRef): Receive = {
     case AliasFor(ref) =>
       ()  // Explicitly ignore this message (could log, etc.)

     case msg =>
       ref ! msg
  }
}

IOW,每个别名本身就是一个参与者,一旦它被告知它是哪个参与者的别名,它就会将它收到的任何消息转发给该参与者,从而使发送到别名等同于发送到它的别名(以成本为代价)一些间接的)。

您可能会发现集群分片比使用参与者地址更合适,即使在单节点情况下也是如此。

一般来说,不可能有一个通用的方法来组合 2 个演员。您必须设计他们的协议以允许将一个状态合并到另一个中(或将两者的状态合并到一个新参与者中),然后将一个转发给另一个(或同时转发给新参与者) .

于 2021-05-27T20:18:16.660 回答