通过持久性 ID 查找演员

Find actor by persistence id

我有一个系统,每个用户都有一个演员。用户很少发送消息,但是当他们发送消息时,他们发送的通常不是一条,而是很少。

目前,我有一张地图,我将其存储在 persistenceId -> ActorRef 中。当我收到一个演员的新消息时,我会查看地图,如果有 ActorRef,我会使用它。如果它丢失了,我会创建它并将其放入地图中。当然,我不想同时拥有同一个持久性参与者的 2 个实例。此外,我不想为每条消息创建和销毁演员,因为恢复可能需要一些时间。

我觉得 "locating or creating" 演员应该有一些更简洁的方式。类似于 actorSystem.getOrCreate(persistenceId, props)。我认为分片可能会帮助我解决这个问题,但我找不到这方面的确切示例。另外,我知道有 actorSelection,它有缺点:

所以基本上问题是,如果我的角色 persistenceId 是 userId,那么在一项服务中定位持久性角色的最佳方式是什么。如果我决定使用分片,那么每个演员 1 个分片。这个可以吗?

Actor 分片正是您所需要的——您可以将其视为 Actor 的分布式地图,无需额外的解决方案。 sharding 负责召唤幕后演员,你不需要自己管理演员。

val sharding = ClusterSharding(system).start(
    typeName = CustomerActor.shardName,
    entityProps = CustomerActor.props,
    settings = ClusterShardingSettings(system),
    extractEntityId = CustomerActor.extractEntityId,
    extractShardId = CustomerActor.extractShardId)
}

其中 extractEntityId 是将消息路由到适当参与者的函数

val extractEntityId: ShardRegion.ExtractEntityId = {
  case gc: GetCustomer => (gc.customerId, gc)
}

最后一个例子:

case class GetCustomer(customerId: String)

sharding ! GetCustomer("customer-id")

此处有更多详细信息https://doc.akka.io/docs/akka/2.5/cluster-sharding.html