如何解决一个演员可以有多个地址吗?
假设我想用演员塑造一个物理个体。这样的人有多个别名(都是唯一的),即电子邮件地址、社会安全号码、护照号码等。
我想合并与任何别名关联的所有数据。
示例
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 举报,一经查实,本站将立刻删除。