通过持久性 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
我有一个系统,每个用户都有一个演员。用户很少发送消息,但是当他们发送消息时,他们发送的通常不是一条,而是很少。
目前,我有一张地图,我将其存储在 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