一个演员可以有多个地址吗?

问题描述

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

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

示例

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,C,D   [Actor 1]

一个actor可以有多个地址吗,或者有没有其他的惯用模式来组合actor?

解决方法

一个演员只有一个地址。

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

这方面的一个例子是(在 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 个演员。您必须设计他们的协议,以允许将一个的状态合并到另一个中(或将两者的状态合并到一个新参与者中),然后将一个转发给另一个(或将两者转发给新参与者) .

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...