サービスファブリックのアーキテクチャパターンとそのベストプラクティスを消化しようとしています。service fabric - ステートフルなサービスです。パーティションごとに1つのインスタンスです。
ユースケース:
は、私は26個のパーティションを持つステートフルなサービスを定義し、各パーティションに私は、同じ最初の文字である単語を格納しています。
- 1)実際にはステートフルサービスのインスタンスが26個ありますか?
- 2)ステートフルサービスの外部、つまり呼び出し元で、サービスファブリッククライアントのURIを作成し、クライアントに操作させたいパーティションIDを指定しています。これは、ステートフルサービス(つまり、サービスクライアントがインスタントポイントと呼ばれ、ステートフルサービスと呼ばれている)のコンテキストに入ったら、他のパーティションを参照できないことを意味しますか?
3)それはステートフルなサービスがニーズは、を上で動作するとが独自に判断を下すことができないパーティションを知っていることを作業単位であると言うことは本当ですか?ここで私はステートフルサービスのRunAsyncメソッドの内部で、基盤となる信頼性の高い店舗への呼び出しがある多くの例を参照しています、例えば、コードがfrom this postを取ら:
protected override async Task RunAsync(CancellationToken cancelServicePartitionReplica) { var myDictionary = await this.StateManager.GetOrAddAsync<IReliableDictionary<string, int>> ("myDictionary"); var partition = base.ServicePartition.PartitionInfo.Id; byte append = partition.ToByteArray()[0]; while (!cancelServicePartitionReplica.IsCancellationRequested) { // Create a transaction to perform operations on data within this partition's replica. using (var tx = this.StateManager.CreateTransaction()) { var result = await myDictionary.TryGetValueAsync(tx, "A"); await myDictionary.AddOrUpdateAsync(tx, "A", 0, (k, v) => v + append); ServiceEventSource.Current.ServiceMessage(this, $"Append {append}: {(result.HasValue ? result.Value : -1)}"); await tx.CommitAsync(); } // Pause for 1 second before continue processing. await Task.Delay(TimeSpan.FromSeconds(3), cancelServicePartitionReplica); } }
だから、おそらく私の文3)間違っている - ステートフルなサービスは、誰か(サービスクライアント)が外部に呼び出すことなく、正確なパーティションの情報を提供することなく内部ストレージを呼び出すことがあります。 しかし、上記のコードがデータを入れるパーティションを決定する方法は?そして、最も重要なのは、正確なパーティションIDを提供するサービスクライアントを介してそのデータを後でどのようにクエリするかです。
a)専門家ではありませんが、パーティション分割(この場合)は、同じパーティション内のインスタンス(技術的にはレプリカと呼ばれる)間でのデータの共有方法に関するものです。パーティションごとに2つのレプリカを持つことができるので、レプリカA_1(ノード1)とレプリカA_2(ノード2)は互いにデータを共有できます。しかし、A_1はB_1とデータを共有できませんでした。b)あなたの質問にあまりにも多くの質問があるかもしれないと思います。 –