我有一个系统,每个用户都有一个 Actor 。用户很少发送消息,但是当他们发送消息时,他们通常不仅发送一条,而且很少发送。
目前,我有一张 map ,用于存储 persistenceId -> ActorRef
.当我收到一个 Actor 的新消息时,我会查看 map ,如果有一个 ActorRef,我就会使用它。如果丢失,我会创建它并将其放入 map 中。当然,我不想同时拥有 2 个相同持久性 actor 的实例。此外,我不想为每条消息创建和销毁参与者,因为恢复可能需要一些时间。
我觉得应该有一些更简洁的方式来“定位或创建”一个 Actor 。类似 actorSystem.getOrCreate(persistenceId, props)
.我认为分片可能对我有帮助,但我找不到确切的例子。另外,我知道有 actorSelection
,它有以下缺点:
维护
费用
所以基本上问题是,如果我的角色persistenceId 是userId,那么在一个服务中定位持久角色的最佳方法是什么。如果我决定使用分片,那么每个 Actor 将是 1 个分片。这个可以吗?
最佳答案
Actor 分片几乎是您所需要的 - 您可以将其视为 Actor 的分布式 map ,而无需其他解决方案。分片负责在幕后召唤 Actor ,您无需自己管理 Actor 。
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
关于scala - 通过持久性ID查找actor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53192288/