微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决一个演员可以有多个地址吗?

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

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

示例

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?