Akka Cluster-Sharding は、Akka ノード全体でステートフルな永続アクターの単一インスタンスを作成する必要があるユース ケースとうまく一致しているようです。
それを構築するために引数を必要とする 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
は、すべての Entry アクターを作成するために単一の Props インスタンスを取り込みます。
val counterRegion: ActorRef = ClusterSharding(system).start(
typeName = "Counter",
entryProps = Some(Props[Counter]),
idExtractor = idExtractor,
shardResolver = shardResolver)
次に、idExtractor の定義方法に基づいて、メッセージを受信する Entry アクターを解決します。shard のソース コードから、特定の Entry アクター インスタンスの名前として id を使用していることがわかります。
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 を把握させる必要があるようですが、値を直接取得するのではなく、文字列から解析するので、これは少しハッキリしています。これは私の最良の選択肢ですか?