riccardo.cardin:
私はカフカのトピックからいくつかのアッカの役者管理し、プロセスメッセージを作成するアプリケーションを開発しています。同じキーを持つメッセージは、同じ俳優が処理されます。私は、対応する俳優に名前を付けるためにも、メッセージキーを使用します。
新しいメッセージがトピックから読み込まれるとメッセージキーと同じIDを持つ俳優がすでにによって作成された場合、私は知らない俳優のシステムかどうか。したがって、私はその名前を使用して俳優を解決しようとすると、それはまだ存在しない場合、私はそれを作成します。私は俳優の解像度に関して同時実行を管理する必要があります。だから、複数のクライアントが要求している可能性があり俳優のシステムを俳優が存在するかどうか。
私が今使っているコードは以下の通りであります:
private CompletableFuture<ActorRef> getActor(String uuid) {
return system.actorSelection(String.format("/user/%s", uuid))
.resolveOne(Duration.ofMillis(1000))
.toCompletableFuture()
.exceptionally(ex ->
system.actorOf(Props.create(MyActor.class, uuid), uuid))
.exceptionally(ex -> {
try {
return system.actorSelection(String.format("/user/%s",uuid)).resolveOne(Duration.ofMillis(1000)).toCompletableFuture().get();
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
});
}
上記のコードは最適化されておらず、例外処理を良好にすることができます。
しかし、そこアッカで俳優を解決するために、より慣用的な方法である、またはそれが存在しない場合は、それを作成するために?私何か不足していますか?
ジェフリー・チョン:
その状態とメッセージIDの地図維持アクター作成検討ActorRef
秒。この「受付」俳優は、メッセージ処理の俳優を取得するためにすべての要求を処理します。受付は、アクター(要求は、メッセージIDが含まれる)のための要求を受信すると、そのマップに関連するアクタを検索しよう:このようなアクターが見つかった場合、それを返しActorRef
、送信者に、それ以外の場合は、新しい処理俳優を作成し、そのマップにその俳優を追加し、戻って送信者に俳優の参照います。