2016-08-30 10 views
1

以下のコードでは、クラスターノードのFrontendNodeが、他のクラスターノードですでに開始されているシャード領域 "SomeShardRegion" への参照を取得する方法を示します。 以下のコードを試してみると、この例外が発生します。シャードタイプ[SomeShardRegion]を最初に起動する必要があります。akkaで別のクラスタノードからシャード領域を取得する方法は?

注:FrontendNodeで別の「SomeShardRegion」を開始したくありません!

object BackendNode extends App { 
    implicit val system = ActorSystem("ClusterSystem", config) 

    ClusterSharding(system).start(
    typeName = "SomeShardRegion", 
    entityProps = someProps, 
    settings = ClusterShardingSettings(system), 
    extractEntityId = idExtractor, 
    extractShardId = shardResolver) 
} 

object FrontendNode extends App { 
    implicit val system = ActorSystem("ClusterSystem", config) 

    // throws an exception: Shard type [SomeShardRegion] must be started first 
    val shardRegion = ClusterSharding(system).shardRegion("SomeShardRegion") 
} 
+0

のビットあなたが別のノードの範囲を取得したいと思いますなぜ私はあなたを求めることができますか?たぶん、あなたが達成したいと思うものに対してより良いパターンがあるかもしれません。 –

+0

確かに。私はDDDをやっていて、当初は私のWebフロントエンドが私の集約ルートリージョンに直接話したがっています。後で、取引を調整できるようにするには、地域を集約するための参照が必要な、長時間実行するトランザクションのために佐賀(PM)を導入します。どちらの場合も、私は上記の問題と同じ問題に遭遇します。代わりの提案がありますか?私に知らせてください。ありがとう。 – Mutaz

+0

DDDとは何ですか?私のクラスタシャーディングフーは錆びていますが、シャーディングに参加しているノードにメッセージチャンネル(パブリッシャーのストリームやそれが呼び出されたもの)を聞く地元の俳優がいることをお勧めします。フロントエンドはチャンネルで話すことができ、リスナーは地域コーディネーターに伝播します。あなたは複数のメッセージなどを処理する必要があります。 –

答えて

0

私はそれを取得する前に必ず領域を開始する必要があるようです。しかし、フロントエンドでエンティティを作成したくない場合は、 start shard region as a proxy

+0

あなた自身の回答を投稿していただきありがとうございます。これは多くの人に役立つことができます:) –

0

私は多くの人がドキュメントを参照することなくドキュメントを参照していることが分かりましたので、ここではドキュメントへのリンク、最も近い点answerにエンティティへ

文書を引用

メッセージは常にローカルShardRegionを経由して送信されます。 名前付きエンティティタイプのShardRegionアクタ参照は、 ClusterSharding.startによって返され、 ClusterSharding.shardRegionで取得することもできます。 ShardRegionは、エンティティのシャードの位置がまだ分かっていない場合は、 の位置を検索します。ここで

コード

// Selecting the ShardRegion with name Counter 
val counterRegion: ActorRef = ClusterSharding(system).shardRegion("Counter") 
counterRegion ! Message 
関連する問題