Akka Cluster-Sharding 看起来与我必须跨 Akka 节点创建有状态持久性参与者的单个实例的用例非常匹配。
我不清楚是否有可能有一个需要参数来构造它的 Entry 演员类型。或者,也许我需要重新考虑 Entry 演员如何获取这些信息。
Object Account {
def apply(region: String, accountId: String): Props = Props(new Account(region, accountId))
}
class Account(val region: String, val accountId: String) extends Actor with PersistentActor { ... }
而ClusterSharding.start
需要一个 Props 实例来创建所有 Entry Actor。
来自akka 集群分片:
val counterRegion: ActorRef = ClusterSharding(system).start(
typeName = "Counter",
entryProps = Some(Props[Counter]),
idExtractor = idExtractor,
shardResolver = shardResolver)
然后它会根据您定义 idExtractor 的方式解析接收消息的 Entry Actor。从 shard 的源代码可以看出,它使用 id 作为给定 Entry actor 实例的名称:
def getEntry(id: EntryId): ActorRef = {
val name = URLEncoder.encode(id, "utf-8")
context.child(name).getOrElse {
log.debug("Starting entry [{}] in shard [{}]", id, shardId)
val a = context.watch(context.actorOf(entryProps, name))
idByRef = idByRef.updated(a, id)
refById = refById.updated(id, a)
state = state.copy(state.entries + id)
a
}
}
看来我应该让我的 Entry 演员通过给定的名称来计算它的区域和 accountId,尽管现在我将从字符串中解析它而不是直接获取值,这确实感觉有点 hacky。这是我最好的选择吗?