【问题标题】:Can an actor have multiple addresses?一个演员可以有多个地址吗?
【发布时间】:2021-05-27 13:22:26
【问题描述】:

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

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

示例

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]

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

【问题讨论】:

    标签: akka actor-model


    【解决方案1】:

    演员只有一个地址。

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

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

    【讨论】:

    • 谢谢,我不熟悉这些技术。你有链接还是更好的伪代码?
    猜你喜欢
    • 2013-01-12
    • 2022-08-20
    • 2012-02-25
    • 2012-05-02
    • 2019-04-22
    • 2011-01-07
    • 2020-07-25
    • 1970-01-01
    • 2013-01-05
    相关资源
    最近更新 更多